Java 图需要多大才能触发斐波那契堆的最坏情况复杂性?

Java 图需要多大才能触发斐波那契堆的最坏情况复杂性?,java,data-structures,dijkstra,fibonacci,Java,Data Structures,Dijkstra,Fibonacci,我一直试图通过使用Dijkstra算法来触发Fibonacci堆的最坏情况复杂性,但显然没有运气。我有一个Dijkstra的第二个实现,使用的是一个普通的二进制堆,它似乎总是赢。我被告知使用较大的数据集进行测试,如图所示(直接从我的程序中粘贴副本): 对 Running Dijkstra's algorithm with 3354 nodes and 8870 links... Source node: ALL Time using Fibonacci heap = 11863138070 ns

我一直试图通过使用Dijkstra算法来触发Fibonacci堆的最坏情况复杂性,但显然没有运气。我有一个Dijkstra的第二个实现,使用的是一个普通的二进制堆,它似乎总是赢。我被告知使用较大的数据集进行测试,如图所示(直接从我的程序中粘贴副本):

Running Dijkstra's algorithm with 3354 nodes and 8870 links...
Source node: ALL
Time using Fibonacci heap = 11863138070 ns (11863.14 ms)
2秒,对12秒。很不一样,好吧

现在,我有另一个图,它有惊人的264000个节点和733000条边。我还没有机会测试它,但这是否足以让斐波那契堆的理论优势大放异彩


我希望我不需要有超过一百万个节点的东西。我的意思是,这不是世界上最大的问题,但如果能有一次看到行动上的不同,那就太好了

首先,你的问题的标题不正确。输入的大小不会影响最坏情况的复杂性。您需要的是图的大小,其中Fibonacci堆的渐进计算复杂性弥补了它的常数因子。还记得旧的好的
O(n)
?好的
O(n)
意味着对于足够大的数据集,您的算法将执行大约
k*n
操作,其中k是一个固定的数字。这
k
是我所指的常数。现在,如果您有一个算法的复杂性
O(n)
,另一个算法的复杂性
O(n*log(n))
,这并不意味着第一个算法总是比第二个算法快。假设第一个执行k1*n操作,第二个执行k2n*log(n)操作。现在,如果k1=k2*1000,那么第一个算法将比第二个算法快,只有当n>21000时,这是非常大的。重要的是,如果有一个值,第一个算法将超过第二个算法


根据给定数据结构的实现,常数可能会有所不同,因此您可能需要几倍大的数据集来弥补它。我已经看到一些结果,斐波那契堆在大约500000条边(和大约5000个节点)上比普通的二进制堆更快,但这些只是针对特定的实现。在您的实现中,根据您实现这两种结构的效率,差异可能会更早或更晚地显示出来。可以肯定的是,如果您以正确的复杂性实现了数据结构,那么对于某些n,差异将显示出来(但可能发生的情况是,现有的计算机无法处理如此大的图形)。

首先,您的问题的标题不正确。输入的大小不会影响最坏情况的复杂性。您需要的是图的大小,其中Fibonacci堆的渐进计算复杂性弥补了它的常数因子。还记得旧的好的
O(n)
?好的
O(n)
意味着对于足够大的数据集,您的算法将执行大约
k*n
操作,其中k是一个固定的数字。这
k
是我所指的常数。现在,如果您有一个算法的复杂性
O(n)
,另一个算法的复杂性
O(n*log(n))
,这并不意味着第一个算法总是比第二个算法快。假设第一个执行k1*n操作,第二个执行k2n*log(n)操作。现在,如果k1=k2*1000,那么第一个算法将比第二个算法快,只有当n>21000时,这是非常大的。重要的是,如果有一个值,第一个算法将超过第二个算法


根据给定数据结构的实现,常数可能会有所不同,因此您可能需要几倍大的数据集来弥补它。我已经看到一些结果,斐波那契堆在大约500000条边(和大约5000个节点)上比普通的二进制堆更快,但这些只是针对特定的实现。在您的实现中,根据您实现这两种结构的效率,差异可能会更早或更晚地显示出来。可以肯定的是,如果您以正确的复杂性实现了数据结构,那么对于某些n,差异将显示出来(但可能发生的情况是,现有的计算机无法处理如此大的图形)。

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

我认为对于大型图形,fibonacci堆不一定更快。您需要增加的是decreaseKey操作的数量。如果节点的平均度数增加(因此是高维图),则应该得到更多这样的操作。或者你可以说,如果图表变得更完整(高度互联)。

你在寻找哪种最坏的情况?Fibonacci堆的Dijkstra的渐近界严格地比二进制堆的Dijkstra的渐近界好。是的,这就是我要说的。不过,我不确定是否有可能用一个足够大的图表来说明这一点。我一直在尝试不同大小的不同数据集,看看F-heap是否会有更好的表现。到目前为止没有运气;二进制堆总是赢的。好吧,我误解了你的问题。嗯,您可能需要一个非常大的图形。根据我的经验,二进制堆是很难被击败的,而歪斜堆是它们不工作时的备份,而斐波那契堆在你做CS理论时通常是很好的。你在寻找哪种最坏的情况?Fibonacci堆的Dijkstra的渐近界严格地比二进制堆的Dijkstra的渐近界好。是的,这就是我要说的。不过,我不确定是否有可能用一个足够大的图表来说明这一点
Running Dijkstra's algorithm with 3354 nodes and 8870 links...
Source node: ALL
Time using Fibonacci heap = 11863138070 ns (11863.14 ms)