是否有斐波那契堆的标准 Java 实现?
Posted
技术标签:
【中文标题】是否有斐波那契堆的标准 Java 实现?【英文标题】:Is there a standard Java implementation of a Fibonacci heap? 【发布时间】:2011-09-10 13:22:36 【问题描述】:我正在研究不同类型的堆数据结构。
对于 (1) 插入、(2) 删除和 (2) 查找最小元素,斐波那契堆似乎具有更好的最坏情况复杂性。
我发现在 Java 中有一个类 PriorityQueue
是一个平衡的二叉堆。但是为什么他们不使用斐波那契堆呢?
另外,java.util
中是否有斐波那契堆的实现?
谢谢!
【问题讨论】:
java 集合只提供最常见的数据结构。我想斐波那契堆更专业,或者它使用的内存更多。 @James,这对斐波那契堆有什么影响? o.o algs4.cs.princeton.edu/code/javadoc/edu/princeton/cs/algs4/… 【参考方案1】:不,标准 Java 集合 API 不包含斐波那契堆的实现。我不确定为什么会这样,但我相信这是因为虽然斐波那契堆在摊销意义上是渐近的,但它们在实践中具有巨大的常数因子。集合框架也没有二项式堆,这将是另一个很好的堆。
作为一个完全无耻的自我插件,我有an implementation of a Fibonacci heap in Java on my personal website。我不确定它会有多大用处,但如果你想知道它是如何工作的,我认为这可能是一个很好的起点。
希望这会有所帮助!
【讨论】:
非常感谢。您的实现看起来做得很好,并且有很多解释。我会看看这个。 哇,我本来想自己写一个好玩的,但你的太棒了! 它在现实中的表现如何?斐波那契堆似乎有相当多的内存开销。 @Anony-Mousse 斐波那契堆在实践中是出了名的慢,这正是你提到的原因。【参考方案2】:但是为什么他们不使用斐波那契堆呢?
可能是因为这些堆的每个条目的开销比二进制键多得多。
另外,Java.util 中有斐波那契堆的实现吗?
不,但是
-
有来自 Nathan Fiedler 的graphmaker - GPL 和良好的test coverage,
但请查看this nice blog post 关于它和关于
斐波那契 impl 可能存在的问题。在这篇文章中,引用了许多其他 Java 实现。
有一些带有单元测试的代码here
JGraphT project(也是 Nathan Fiedler)和(一些次要的)tests 但 LGPL。
最后但并非最不重要的是Neo4j - GPL - 没有测试。
【讨论】:
【参考方案3】:但是为什么他们不使用斐波那契堆呢?
我认为主要原因是斐波那契堆只能在你有更多的 reduceKey 操作连接到一个 extractMin 操作的情况下才有帮助。例如,当您将它与 Dijkstra 算法一起使用时。
另外,Java.util 中有斐波那契堆的实现吗?
Java.util 中没有实现,但我使用现有的开源版本的 Fibonacci 堆在这个主题上做了一些实验。您可以在on my blog 或project's GitHub repository 上找到它。
【讨论】:
您能否详细说明您对第一个问题的回答 当然可以。 Fibonacci Heap 在执行 reduceKey 和 insert 操作方面优于 Binary Heap,并且对于 extractMin 具有相同的时间复杂度,但是 FH 的此操作比 BH 花费的时间要多得多,因为它正在巩固内部树森林。因此,如果您有非常少的 reduceKey,那么它会比正常的二进制堆慢。对于一些特殊的图,Dijkstra 算法就是这种情况。以上是关于是否有斐波那契堆的标准 Java 实现?的主要内容,如果未能解决你的问题,请参考以下文章
高级数据结构—二项堆与斐波那契堆详细介绍(算法导论中科大USTC)