繁体   English   中英

具有特定值的数组

[英]Array with specific values

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

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

这是一种可能的方法:

  • 扫描数组并在分摊的 O(n)时间内在哈希表中存储元素频率(有log n个不同的元素); 这是可行的,因为我们可以在摊销的O(1)时间内进行插入 ;
  • 现在在这些log n元素上运行经典的排序算法:这在确定性O(log n log log n)时间内是可行的,比如使用堆排序或合并排序;
  • 现在展开已排序的数组---或创建一个新数组并使用排序数组和哈希表填充它 - 使用哈希表中的频率; 这在O(n)摊销时间是可行的。

因此,整个算法以摊销的O(n)时间运行,即,它通过消除重复和扩展排序的阵列来主导。 空间复杂度为O(n)。

这基本上是最佳的,因为您需要“触摸”所有元素以打印排序的数组,这意味着我们在运行时间上具有匹配的下限Omega(n)。

我们的想法是使用多数算法,该算法取O(n)然后发现什么是“半”值从数组中删除它然后再在新数组上再做n + n / 2 + n / 4 + n / 8 + ..... <2n => O(n)

遍历数组一次,保留哈希映射以查看值。 就像你说的那样,只有log(n)不同的值。

现在你有了所有不同值的列表 - 对它们进行排序将需要lon(n)*log(log(n))

一旦你有了排序的uniq,就像它很容易构建原始数组:最大值将需要n/2单元格,第二个需要n/4 ,依此类推。

总运行时间为O(n + lon(n)*log(log(n)) + n) ,即O(n)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM