有效地为数组中的每个元素查找较小元素的数量


9

我陷入了这个问题:

给定的阵列A第一n自然数随机地置换,阵列B构造,使得 B(k是从元件的数量A(1A(k1其是小于A(k

i)给定一个,您可以在O n 时间内找到吗? ii)给定B,您可以在O n 时间内找到A吗?Oñ
一个Øñ

在此,1个=0。对于一个具体的例子:

|一个8431个72965000031个644|

谁能帮我?谢谢。


我发现了这一点:计算置换编码可为这些问题提供Øñ日志ñ算法。至少我认为它们是同样的问题。
Realz Slaw 2012年

@Merbs您提供的提示是否表示您有解决方案?
2012年

1
@AJed,这意味着我有一个算法,尽管对于没有空间的简单算法,它要花,如果允许空间,它要花O n log n 。目前,我倾向于在O n )中都不可能,并且两者都是相同的算法。Øñ2Øñ日志ñØñ
Merbs

@Merbs。我觉得您的提示会导致正确的选择。我也有一个解决方案(按照您的提示)。我猜想分析中有一个技巧可以使结果变为 ..我认为,该技巧是知道A仅从1:n开始Øñ一个ñ
2012年

2
本文还给出了一种算法。您确定为此存在On 算法吗?Øñ日志ñØñ
Realz Slaw 2012年

Answers:


1

A确定的天真的算法:一个

对于,通过将i = 1 k的每个A i A k 进行比较 并计算满足A i < A k 的值来确定B k 的值ķ=1个ñķ一个一世一个ķ一世=1个ķ一个一世<一个ķ

该算法将与所有其他对象进行比较(n 1次),将A 2 与其他n 2个进行比较,依此类推,因此比较的总数为n 1 n 2 )个。一个1个ñ-1个一个2ñ-2。但这不是我们能做的最好的事情。例如,查看Bn,我们不必进行任何比较!Bn=An1,因为它是n个自然数,并且可以保证(与排列无关)n1个较低的自然数在那里。怎么样ñ-1?而不是检查A1Anñ-1个ñ-22ññ=一个ñ-1个 ññ-1个ñ-1个一个1个,我们可以只检查 A n 。那是:一个ñ-2一个ñ

对于,使用以上算法;对于 k=nķ=1个ñ2使用逆算法:通过将Bk初始设置为An1,然后对每个条目Ai减去1来确定Bki=k+1n较小比Ak)大ķ=ñ2ñķ一个ñ-1个1个一个一世一世=ķ+1个ñ一个ķ

这将花费步,仍然是On2。还要注意的是在构建,如果Ñ=Ñ-1然后Ñ=Ñ+12×ñ2-1个ñ2-22=ñ-2ñ-44Øñ2一个B(n)=A(n)1A(n)=Bñ+1个

但现在更多技巧。如果允许我们提供一些额外的空间或就地排序,则可以在比较数字时对其进行排序。例如:

|一个8431个72965小号9874321个65000031个6|

代替检查所有(或按顺序检查)它们,我们可以使用二进制搜索来确定每个。但是,排序仍然需要时间O n log n ķØñ日志ñ


这只是我的第一个想法;尽管我意识到这个问题比我最初认为的要有趣得多。而且我还没有机会阅读Realz Slaw的发现,因此该算法可能已失效。
Merbs

0

而不是确定每个每次一个,我们可以向前看,只有通过每数一个曾经!但是我们将使用n个空间:B(k)A n

|A123456789B800000000104000011112030001222230101123333407011233345320123444561901234445666012344567450123456784|

通过不更新已经确定的变量,我们可以节省更多时间(也就是说,第一步之后没有必要更新),但是在最坏的情况下,我们仍然必须更新n n + 2 8(n)(n+2)2


0

使用#next_greater_element可以解决I和II问题,我在这里进行了解释。但是它比问题本身要难一些,但是在解决方案之前,您需要学习下一个更大的要素:

  1. 考虑到我们拥有的每一个元素的矢量命名为S ^ 的元素。现在运行一次开始从右到左但除了设定元件的下一个更大的算法在其下更大的元素索引,推小号的元素是他们的下一个较大的element.then迭代过从左到右,然后将阵列 [ ] = Σ X Ĵ = 0š [ Ĵ ] + 1 ,其中X一个小号一世一世一世一个小号一世一世B[i]=j=0x(Si[j]+1)x是向量及其Θ n 的大小, 因为每个下一个更大的算法都是Θ n 并且迭代也是Θ n SiΘ(n)Θ(n)Θ(n)

第二部分也类似,指出我们可以在获得最右边元素的值。 编辑:我的解决方案是错误的,似乎它没有任何o n 解决方案O(1)o(n)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.