【问题标题】:Heapsort: why not use "Soft Heap" to boost the performance?堆排序:为什么不使用“软堆”来提高性能?
【发布时间】:2013-06-05 17:06:20
【问题描述】:

Soft Heap wikipedia 页面看来,最小提取只需要恒定时间,因此使用软堆执行堆排序应该会导致摊销 O(n)。即使常数很大,对于非常大的 n,该算法也应该非常有用。但我从来没有听到有人提到过这个。人们是否有理由不使用它?

谢谢!

【问题讨论】:

    标签: sorting data-structures heap heapsort soft-heap


    【解决方案1】:

    跟进@Rob 的观点:

    基于比较的排序算法的效率存在理论上的限制,堆排序就是其中之一。 No comparison-based sort can do have runtime better than Ω(n log n) in the average case。由于堆排序是 Θ(n log n),这意味着它是渐近最优的,并且不可能有 O(n) 平均时间变量(至少,不是基于比较的变量)。这个论点的证明来自信息论 - 如果不进行至少 Ω(n log n) 比较,就无法可靠地区分输入排列与任何其他输入排列。

    软堆的发明是从二项式堆开始并破坏部分键,这样从软堆中插入和出列 n 个元素不一定对它们进行排序。 (The original paper on soft heaps 在其摘要中提到,结构的独创性是人为地降低了存储值的“熵”以击败 Ω(n log n) 障碍)。这就是软堆可以支持 O(1) 时间操作的原因:与普通堆结构不同,它并不总是排序,因此不受上面给出的运行时障碍的约束。因此,n 个对象可以在 O(n) 时间内从软堆入队和出队这一事实立即表明您不能使用软堆来加速堆排序。

    更一般地说,没有办法使用任何基于比较的数据结构来构建排序算法,除非你在使用该数据结构时平均至少做了 Ω(n log n) 的工作。例如,this earlier question 解释了为什么你不能在 O(n) 时间内将二进制堆转换为 BST,因为这样做会让你在 O(n) 时间内纯粹使用比较进行排序(在 O(n ) 时间,然后在 O(n) 时间内转换为 BST,然后在 O(n) 时间内进行中序遍历以恢复已排序的序列。

    希望这会有所帮助!

    【讨论】:

    • 感谢@Rob 和@templatetypedef!
    • 但应该是Ω (n lg n) 在你的第一段?我是说障碍。
    • @xuhdev- 我相信是的。 Ω(n log n) 表示“渐近至少 n log n”,障碍是每个基于比较的排序算法必须在平均情况下进行至少 Ω(n log n) 比较。说“至少 O(n log n) 比较”是不正确的,因为 big-O 表示法给出了 上限,而 Ω 给出了 下限 .这有意义吗?
    • 是的,这是有道理的,一开始我只是感到困惑。谢谢
    • 我想知道使用软堆运行堆排序的结果是“接近排序”还是随机的。如果是前者,软堆排序 + 一个 O(N) 最佳情况排序(如平滑排序)可能是一个有趣的混合体。
    【解决方案2】:

    软堆遭受“损坏”(阅读您链接到的页面),这使得它不能用作通用排序例程的组件。大多数时候你只会得到错误的答案。

    如果您有一些应用程序需要排序,但可以处理作为实现的一部分从软堆中获得的“损坏”结果,那么这会给您带来潜在的加速。

    斐波那契堆不会遭受“损坏”,但是它有 O(log n) 的删除时间。您可以将 Fibonacci Heap 用作通用排序例程的一部分,但排序的整体性能将是 O(n log n)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多