具有特定值的数组

时间:2016-04-06 06:57:14

标签: arrays algorithm data-structures

给定一个数组大小为n的位置: 阵列的1/2具有单个(未知)值。 阵列的1/4具有单个(未知)不同的值。 等等为1 / 8,1 / 16,1 / 32 给出一个算法来排序数组。 您不能使用查找中值算法

所以我想的是: 只有logn不同的值 在O(n * loglogn)上使用二进制堆有一个简单的解决方案 它看起来像是一个需要在O(n)

中解决的问题

3 个答案:

答案 0 :(得分:3)

这是一种可能的方法:

  • 扫描数组并在amortized O(n)时间内在哈希表中存储元素频率(有log n个不同的元素);这是可行的,因为we can do insertions in amortized O(1) time;
  • 现在对这些log n元素运行经典排序算法:这在确定性O(log n log log n)时间内是可行的,比如使用堆排序或合并排序;
  • 现在展开已排序的数组---或创建一个新数组并使用排序数组和哈希表填充它 - 使用哈希表中的频率;这在O(n)摊销时间是可行的。
因此,整个算法以摊销的O(n)时间运行,即,它通过消除重复和扩展排序的阵列来主导。空间复杂度为O(n)。

这基本上是最优的,因为你需要“触摸”所有元素来打印排序的数组,这意味着我们在运行时间上有一个匹配的下限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)