我正在研究不同类型的堆数据结构。
Fibonacci堆似乎具有更好的最坏情况复杂度(1)插入,(2)删除和(2)找到最小元素。
我发现在Java中有一个类PriorityQueue
,它是一个平衡的二进制堆。但是为什么他们没有使用Fibonacci堆?
另外,java.util
中是否有斐波纳契堆的实现?
谢谢!
答案 0 :(得分:45)
不,标准Java集合API不包含Fibonacci堆的实现。我不确定为什么会这样,但我相信这是因为虽然斐波那契堆在分摊意义上是渐近的,但它们在实践中有很大的常数因素。集合框架也没有二进制堆,这将是另一个要包含的好堆。
作为一个完全无耻的自我插件,我有an implementation of a Fibonacci heap in Java on my personal website。我不确定它会有多大用处,但是如果你很想知道它是如何工作的,我认为它可能是一个很好的起点。
希望这有帮助!
答案 1 :(得分:5)
但为什么他们没有使用Fibonacci堆?
可能是因为那些堆每个条目的开销比二进制密钥多得多。
此外,Java.util中是否有Fibonacci堆的实现?
不,但是
答案 2 :(得分:1)
但为什么他们没有使用Fibonacci堆?
我认为主要原因是因为当你有更多的reduceKey操作连接到一个extractMin操作时,Fibonacci堆只能提供帮助。例如,当您使用Dijkstra算法时。
此外,Java.util中是否有Fibonacci堆的实现?
Java.util中没有实现,但我使用Fibonacci堆的现有开源版本对此主题进行了一些实验。您可以在on my blog或project's GitHub repository找到它。