是否有Fibonacci堆的标准Java实现?

时间:2011-06-08 03:17:17

标签: java data-structures heap fibonacci-heap

我正在研究不同类型的堆数据结构。

Fibonacci堆似乎具有更好的最坏情况复杂度(1)插入,(2)删除和(2)找到最小元素。

我发现在Java中有一个类PriorityQueue,它是一个平衡的二进制堆。但是为什么他们没有使用Fibonacci堆?

另外,java.util中是否有斐波纳契堆的实现?

谢谢!

3 个答案:

答案 0 :(得分:45)

不,标准Java集合API不包含Fibonacci堆的实现。我不确定为什么会这样,但我相信这是因为虽然斐波那契堆在分摊意义上是渐近的,但它们在实践中有很大的常数因素。集合框架也没有二进制堆,这将是另一个要包含的好堆。

作为一个完全无耻的自我插件,我有an implementation of a Fibonacci heap in Java on my personal website。我不确定它会有多大用处,但是如果你很想知道它是如何工作的,我认为它可能是一个很好的起点。

希望这有帮助!

答案 1 :(得分:5)

  

但为什么他们没有使用Fibonacci堆?

可能是因为那些堆每个条目的开销比二进制密钥多得多。

  

此外,Java.util中是否有Fibonacci堆的实现?

不,但是

  1. 来自Nathan Fiedler的graphmaker - GPL和良好的test coverage, 但请查看this nice blog post关于它的内容 斐波纳契所带来的问题。在这篇文章中,引用了许多其他Java实现。
  2. 有一些单元测试代码here
  3. JGraphT project(也是Nathan Fiedler)以及(一些未成年人)tests但是LGPL。
  4. 最后但并非最不重要的是Neo4j - GPL - 没有测试。

答案 2 :(得分:1)

  

但为什么他们没有使用Fibonacci堆?

我认为主要原因是因为当你有更多的reduceKey操作连接到一个extractMin操作时,Fibonacci堆只能提供帮助。例如,当您使用Dijkstra算法时。

  

此外,Java.util中是否有Fibonacci堆的实现?

Java.util中没有实现,但我使用Fibonacci堆的现有开源版本对此主题进行了一些实验。您可以在on my blogproject's GitHub repository找到它。