我一直在尝试通过与Dijkstra的算法配合使用来触发Fibonacci堆的最坏情况的复杂性,但是显然没有运气。 我有一个使用香草二进制堆的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个边。 我还没有机会进行测试,但这足以使斐波那契堆的理论优势发光吗?

我希望我不需要一百万个以上的节点。 我的意思是这不是世界上最大的问题,但是很高兴能一次看到行动上的不同。

===============>>#1 票数:1

首先,您问题的标题不正确。 输入的大小不会影响最坏情况的复杂性。 您需要的是图的大小,其中斐波那契堆的渐近计算复杂性将弥补其恒定因子。 还记得旧的O(n)吗? 那么O(n)意味着对于足够大的数据集,您的算法将执行大约k*n运算,其中k为固定数。 这个k是我指的常数。 现在,如果您有一个算法,其复杂度为O(n)而另一个算法的复杂度为O(n*log(n)) ,这仍然并不意味着第一个算法总是比第二个算法快。 想象一下,第一个执行k 1 * n个操作,第二个执行k 2 n * log(n)个操作。 现在,如果K 1 = K 2 * 1000,比的事实,即第一algortihm将比第二个更快仅当n> 21000,这是相当大的 重要的是,如果您拥有一个第一个算法将超过第二个算法的值。

根据给定数据结构的实现,常数可能会有所不同,因此您可能需要数倍大的数据集来弥补它。 我看到了一些结果,其中斐波那契堆在大约500 000个边(和大约5000个节点)上比普通的旧二进制堆快,但这些仅用于特定的实现。 在您的实现中,差异可能会更早或更晚显示,具体取决于您实现这两种结构的效率。 可以肯定的是,如果以正确的复杂度实现数据结构,则差异将显示n个(但是可能会发生,现有计算机无法处理那么大的图形)。

===============>>#2 票数:0

我认为您的斐波那契堆对于大型图形而言不一定更快。 您需要增加的是reduceKey操作的数量。 如果节点的平均度数增加,则应该进行更多此类操作(因此是高维图)。 或者可以说图是否变得更加完整(高度互连)。

  ask by Fiery Phoenix translate from so

未解决问题?本站智能推荐: