【发布时间】:2013-04-17 22:19:09
【问题描述】:
我一直试图通过将斐波那契堆与 Dijkstra 的算法一起使用来触发最坏情况的复杂性,但显然没有运气。我有第二个使用香草二进制堆的 Dijkstra 实现,它似乎总是赢。我被告知要使用更大的数据集进行测试,如图所示(直接从我的程序中复制粘贴):
Running Dijkstra's algorithm with 3354 nodes and 8870 links...
Source node: ALL
Time using binary heap = 2167698339 ns (2167.70 ms)
对比...
Running Dijkstra's algorithm with 3354 nodes and 8870 links...
Source node: ALL
Time using Fibonacci heap = 11863138070 ns (11863.14 ms)
2 秒,而约 12 秒。差别很大好吧。
现在,我有另一个图表,其中包含多达 264,000 个节点和 733,000 条边。我还没有机会对其进行测试,但这足以让斐波那契堆的理论优势大放异彩吗?
我希望我不需要超过一百万个节点的东西。我的意思是这不是世界上最大的问题,但很高兴能看到一次行动的不同。
【问题讨论】:
-
您在寻找哪种最坏的情况?带有斐波那契堆的 Dijkstra 的渐近界严格优于带有二进制堆的版本。
-
是的,这就是我要说的。不过,我不确定是否可以用足够大的图表来证明这一点。我一直在尝试不同大小的不同数据集,看看 F-heap 是否会一次更好地执行。到目前为止没有运气;二叉堆总是赢。
-
好的,我误解了你的问题。好吧,您可能需要一个非常大的图表。以我的经验,二叉堆很难被击败,而倾斜堆在它们不起作用时是备用,而斐波那契堆在你做 CS 理论时大多很好。
标签: java data-structures dijkstra fibonacci