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


9

我陷入了这个问题:

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

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

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

|一个8431个72965乙000031个644|

谁能帮我?谢谢。


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

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

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

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

2
本文还给出了一种算法。您确定为此存在O(n )算法吗?Ø(ñ日志⁡ñ)Ø(ñ)
— 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。但这不是我们能做的最好的事情。例如,查看B(n),我们不必进行任何比较!B(n)=A(n)−1,因为它是前n个自然数,并且可以保证(与排列无关)n−1个较低的自然数在那里。怎么样乙(ñ-1)?而不是检查A(1)到A(n(ñ-1个)(ñ-2)2乙(ñ)乙(ñ)=一个(ñ)-1个 ññ-1个乙(ñ-1个)一个(1个),我们可以只检查 A (n )。那是:一个(ñ-2)一个(ñ)

对于,使用以上算法;对于 k=nķ=1个,…,ñ2使用逆算法:通过将B(k)初始设置为A(n)−1,然后对每个条目A(i)减去1来确定B(k),i=k+1,…,n较小比A(k)大。ķ=ñ2,…,ñ乙(ķ)一个(ñ)-1个1个一个(一世)一世=ķ+1个,…,ñ一个(ķ)

这将花费步,仍然是O(n2)。还要注意的是在构建甲从乙,如果乙(Ñ)=阿(Ñ)-1然后甲(Ñ)=乙(Ñ)+1。2×(ñ2-1个)(ñ2-2)2=(ñ-2)(ñ-4)4Ø(ñ2)一个乙B(n)=A(n)−1A(n)=B(ñ)+1个

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

|一个8431个72965小号9874321个65乙000031个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.