【问题标题】:Which priority queue is faster in practice?在实践中哪个优先级队列更快?
【发布时间】:2020-02-07 16:18:55
【问题描述】:

最常用的操作:FindMin。不太常见:Insert 和 ExtractMin。很少:删除节点。非常罕见:合并。

在所列条件下,以下哪个优先级队列实际上更快?

  • 基于排序双向链表的朴素实现
  • 简单堆
  • 左派堆
  • 二项式堆
  • 斐波那契堆
  • 2-3 堆
  • 配对堆
  • 薄堆
  • 厚堆
  • 倾斜二项式堆
  • 布罗达尔-冈崎队列

【问题讨论】:

  • 欢迎来到 Stack Overflow,@iVeryBadGuy。对于此类问题,建议您快速进行 Google 搜索。您很可能会获得对您有帮助的资源。

标签: data-structures heap


【解决方案1】:

根据我五年多前所做的工作,我的经验是,在一般情况下,3 堆的性能优于二叉堆。跳过列表堆和配对堆稍微优于 3 堆,但内存成本更高。以上三个都优于斐波那契堆。

Brodal 队列理论上是最有效的。但是,正如布罗达尔本人所说,它们“相当复杂”并且“[不]在实践中适用”。 https://en.wikipedia.org/wiki/Brodal_queue

很多人都在谈论斐波那契堆效率,而渐近分析表明它应该优于其他类型的堆。经验数据往往不能证明这一点。如https://en.wikipedia.org/wiki/Fibonacci_heap#Worst_case 所述,斐波那契堆有明显的缺点。

如果您希望实现堆,我建议您从二进制堆开始。或者 3 堆,这是一个简单的优化。如果我需要更高的性能,我的下一步将是配对堆。它易于实施且非常有效。

除此之外,我没有任何建议。我在其他类型的堆上看到的性能数据并没有显示出明显的赢家。

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 2011-12-20
    • 2012-03-03
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多