data-structures - 实践中哪个优先级队列更快?

标签 data-structures heap

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

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

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

最佳答案

根据我五年多前所做的工作,我的经验是,在一般情况下,3 堆的性能优于二进制堆。跳过列表堆和配对堆的性能略优于 3 堆,但内存成本更高。上述所有三个指标均优于斐波那契堆。

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

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

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

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

关于data-structures - 实践中哪个优先级队列更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60117309/

相关文章:

c - 数组的POD结构

queue - 在 O(1) 时间内支持最小、最大操作的队列的正确数据结构是什么?

heap - 何时使用最大堆而不是最小堆?

python - 添加新元素时 Heapify 不起作用

algorithm - 给定二维平面中的 n 个点,我们必须找到每个点之间的 k 个最近邻居

java - "group by"的最佳数据结构和 Java 中的聚合值?

java - 如何查看 java.util.PriorityQueue 的尾部?

python - python中的最小堆

algorithm - 最接近原点的二维坐标

python - 大小不等的压缩列表