是否有斐波那契堆的标准 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)

Dijkstra算法介绍及其优先队列优化和斐波那契堆优化

高级数据结构—斐波那契堆与二项堆详细介绍(算法导论中科大USTC)

算法导论——斐波那契堆

[硕.Love Python] FibonacciHeap(F堆 & 斐波那契堆)