【问题标题】:Array with specific values具有特定值的数组
【发布时间】:2016-04-06 06:57:14
【问题描述】:

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

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

【问题讨论】:

  • 确实和我的解决方案很相似
  • 绝对不是实数

标签: arrays algorithm data-structures


【解决方案1】:

这是一种可能的方法:

  • 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) 下限。

【讨论】:

  • 这里可以在 O(n) 中创建哈希表的假设是不正确的。更具体地说,它不是确定性的。
  • 我认为你混淆了摊销和统计。除非你有正式的证据证明使用势函数会让我感到惊讶
  • @OferMagen 这是一个众所周知的事实;请参阅this link,“分析哈希表”部分。
  • @blazs O(1) 界限是随机摊销(“哈希表的最坏情况性能与底层存储桶数据结构相同”) .
【解决方案2】:

这个想法是使用采用 O(n) 的众数算法,然后发现什么是“一半”值,将其从数组中删除,然后在新数组上再次执行 n+n/2+n/4+n/8+..... O (n)

【解决方案3】:

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

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

一旦你有了排序后的 uniq,就很容易收缩原始数组:最大值将采用 n/2 单元格,第二个采用 n/4 等等。

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

【讨论】:

  • 不是二叉树,时间复杂度和你写的不一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2014-08-14
  • 2021-12-12
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多