哪个优先级队列在实践中更快?
Which priority queue is faster in practice?
最常用的操作:FindMin。不太常见:Insert 和 ExtractMin。很少:删除节点。非常罕见:合并。
在列出的条件下,以下哪个优先级队列实际上更快?
- 基于排序双向链表的简单实现
- 简单堆
- 左派堆
- 二项式堆
- 斐波那契堆
- 2-3堆
- 配对堆
- 精简堆
- 厚堆
- 倾斜二项式堆
- Brodal-冈崎队列
根据我五年多前所做的工作,我的经验是,在一般情况下,3 堆优于二进制堆。跳过列表堆和配对堆的性能略优于 3 堆,但内存成本更高。以上三个都优于斐波那契堆。
Brodal 队列理论上是最有效的。但是,正如 Brodal 自己所说,它们 "quite complicated" 并且“[不] 在实践中适用”。 https://en.wikipedia.org/wiki/Brodal_queue
很多人都在谈论斐波那契堆效率,渐近分析说它应该优于其他类型的堆。经验数据往往不能证明这一点。如 https://en.wikipedia.org/wiki/Fibonacci_heap#Worst_case.
中所述,Fibonacci 堆有明显的缺点
如果您要实现堆,我建议您从二叉堆开始。或者一个 3-heap,这是一个简单的优化。如果我需要更多性能,我的下一步将是配对堆。它易于实施且非常有效。
除此之外,我没有任何建议。我在其他类型的堆上看到的性能数字并没有显示出明显的赢家。
最常用的操作:FindMin。不太常见:Insert 和 ExtractMin。很少:删除节点。非常罕见:合并。
在列出的条件下,以下哪个优先级队列实际上更快?
- 基于排序双向链表的简单实现
- 简单堆
- 左派堆
- 二项式堆
- 斐波那契堆
- 2-3堆
- 配对堆
- 精简堆
- 厚堆
- 倾斜二项式堆
- Brodal-冈崎队列
根据我五年多前所做的工作,我的经验是,在一般情况下,3 堆优于二进制堆。跳过列表堆和配对堆的性能略优于 3 堆,但内存成本更高。以上三个都优于斐波那契堆。
Brodal 队列理论上是最有效的。但是,正如 Brodal 自己所说,它们 "quite complicated" 并且“[不] 在实践中适用”。 https://en.wikipedia.org/wiki/Brodal_queue
很多人都在谈论斐波那契堆效率,渐近分析说它应该优于其他类型的堆。经验数据往往不能证明这一点。如 https://en.wikipedia.org/wiki/Fibonacci_heap#Worst_case.
中所述,Fibonacci 堆有明显的缺点如果您要实现堆,我建议您从二叉堆开始。或者一个 3-heap,这是一个简单的优化。如果我需要更多性能,我的下一步将是配对堆。它易于实施且非常有效。
除此之外,我没有任何建议。我在其他类型的堆上看到的性能数字并没有显示出明显的赢家。