【问题标题】:When is it a bad idea to use a heap for a Priority Queue?什么时候为优先队列使用堆是个坏主意?
【发布时间】:2013-10-02 05:58:45
【问题描述】:

在 Cormen 等人的《算法简介》一书中解释 Dijkstra 算法的部分中。等,在分析算法的复杂性时,他们说

如果图足够稀疏......我们可以通过使用二进制最小堆实现最小优先级队列来改进算法

所以我想知道,这样的声明有什么必要?将堆用于优先级队列不是更明智吗?

【问题讨论】:

标签: algorithm heap priority-queue


【解决方案1】:

有许多不同的方法可以实现优先级队列。二进制最小堆很有用,因为它性能相当好并且易于实现。但是pairing heap 也很容易实现,并且它对某些操作具有更好的性能。特别是,它执行减少键操作的速度比二叉堆快得多。

或者您可以使用skip list 优先级队列。跳过列表具有一些很好的属性,使其在某些优先队列应用程序中具有吸引力。特别是,创建并发跳过列表比创建并发堆更容易。

所以,不,将堆用于优先级队列并不总是更明智。几乎可以肯定,使用堆比使用排序列表更明智,但有时其他东西比堆更合适。

【讨论】:

    【解决方案2】:

    https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

    上面写着:

    • Dijkstra 的原始算法不使用最小优先级队列,运行时间为 O(|V|^2)。

    所以书中的说法只是说可以优化原始算法。

    • 基于由 Fibonacci 堆 实现并在 O(|E|+|V|log|V|) 中运行的最小优先级队列的实现(其中 |E| 是边缘)归因于(Fredman & Tarjan 1984)。

    二叉堆只是堆的一种。还有其他类型更适合特定场景。

    【讨论】:

      猜你喜欢
      • 2013-08-05
      • 2012-09-10
      • 2012-07-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多