我正在研究不同类型的堆数据结构。
对于 (1) 插入、(2) 删除和 (2) 查找最小元素,斐波那契堆似乎具有更好的最坏情况复杂性。
我发现在 Java 中有一个类PriorityQueue
是平衡的二进制堆。但是为什么他们不使用斐波那契堆呢?
另外,是否有斐波那契堆的实现java.util
?
谢谢!
我正在研究不同类型的堆数据结构。
对于 (1) 插入、(2) 删除和 (2) 查找最小元素,斐波那契堆似乎具有更好的最坏情况复杂性。
我发现在 Java 中有一个类PriorityQueue
是平衡的二进制堆。但是为什么他们不使用斐波那契堆呢?
另外,是否有斐波那契堆的实现java.util
?
谢谢!
不,标准 Java 集合 API 不包含斐波那契堆的实现。我不确定为什么会这样,但我相信这是因为虽然斐波那契堆在摊销意义上是渐近的,但在实践中它们具有巨大的常数因子。集合框架也没有二项式堆,这将是另一个很好的堆。
作为一个完全无耻的自插件,我在我的个人网站上有一个用 Java 实现的斐波那契堆。我不确定它会有多大用处,但如果你想知道它是如何工作的,我认为这可能是一个很好的起点。
希望这可以帮助!
但是为什么他们不使用斐波那契堆呢?
可能是因为这些堆的每个条目的开销比二进制键多得多。
此外,Java.util 中是否有斐波那契堆的实现?
不是,但
但是为什么他们不使用斐波那契堆呢?
我认为主要原因是因为斐波那契堆只能在您有更多的 reduceKey 操作连接到一个 extractMin 操作的情况下提供帮助。例如,当您将它与 Dijkstra 算法一起使用时。
此外,Java.util 中是否有斐波那契堆的实现?
Java.util 中没有实现,但我使用现有的开源版本的斐波那契堆对此主题进行了一些实验。您可以在我的博客或项目的 GitHub 存储库上找到它。