我陷入了这个问题:
给定的阵列第一自然数随机地置换,阵列构造,使得 是从元件的数量至其是小于。
i)给定,您可以在O (n )时间内找到吗? ii)给定B,您可以在O (n )时间内找到A吗?
在此,。对于一个具体的例子:
谁能帮我?谢谢。
我陷入了这个问题:
给定的阵列第一自然数随机地置换,阵列构造,使得 是从元件的数量至其是小于。
i)给定,您可以在O (n )时间内找到吗? ii)给定B,您可以在O (n )时间内找到A吗?
在此,。对于一个具体的例子:
谁能帮我?谢谢。
Answers:
从A确定的天真的算法:
对于,通过将i = 1 ,… ,k的每个A (i )与A (k )进行比较 并计算满足A (i )< A (k )的值来确定B (k )的值)。
该算法将与所有其他对象进行比较(n − 1次),将A (2 )与其他n − 2个进行比较,依此类推,因此比较的总数为(n − 1 )(n − 2 )个。。但这不是我们能做的最好的事情。例如,查看B(n),我们不必进行任何比较!B(n)=A(n)−1,因为它是前n个自然数,并且可以保证(与排列无关)n−1个较低的自然数在那里。怎么样乙(ñ-1)?而不是检查A(1)到A(n ,我们可以只检查 A (n )。那是:
对于,使用以上算法;对于 k=n使用逆算法:通过将B(k)初始设置为A(n)−1,然后对每个条目A(i)减去1来确定B(k),i=k+1,…,n较小比A(k)大。
这将花费步,仍然是O(n2)。还要注意的是在构建甲从乙,如果乙(Ñ)=阿(Ñ)-1然后甲(Ñ)=乙(Ñ)+1。
但现在更多技巧。如果允许我们提供一些额外的空间或就地排序,则可以在比较数字时对其进行排序。例如:
代替检查所有(或按顺序检查)它们,我们可以使用二进制搜索来确定每个。但是,排序仍然需要时间O (n log n )。
使用#next_greater_element可以解决I和II问题,我在这里进行了解释。但是它比问题本身要难一些,但是在解决方案之前,您需要学习下一个更大的要素:
第二部分也类似,指出我们可以在获得最右边元素的值。 编辑:我的解决方案是错误的,似乎它没有任何o (n )解决方案