给定一个数组大小为n的位置: 阵列的1/2具有单个(未知)值。 阵列的1/4具有单个(未知)不同的值。 等等为1 / 8,1 / 16,1 / 32 给出一个算法来排序数组。 您不能使用查找中值算法
所以我想的是: 只有logn不同的值 在O(n * loglogn)上使用二进制堆有一个简单的解决方案 它看起来像是一个需要在O(n)
中解决的问题答案 0 :(得分:3)
这是一种可能的方法:
这基本上是最优的,因为你需要“触摸”所有元素来打印排序的数组,这意味着我们在运行时间上有一个匹配的下限Omega(n)。
答案 1 :(得分:1)
这个想法是使用Majority算法,它取O(n)然后发现什么是从数组中删除它的“half”值然后在新数组上再次执行 n + n / 2 + n / 4 + n / 8 + .....< 2n => O(n)
答案 2 :(得分:0)
遍历数组一次,保留哈希映射以查看值。
就像你说的那样只有log(n)
个不同的值。
现在您拥有所有不同值的列表 - 对它们进行排序将采用lon(n)*log(log(n))
一旦你有了排序的uniq,就像它很容易构建原始数组:最大值将取n/2
个单元格,第二个取n/4
,依此类推。
总运行时间为O(n + lon(n)*log(log(n)) + n)
,即O(n)