【问题标题】:How large does a graph need to be to trigger the worst-case complexity of a Fibonacci heap?需要多大的图才能触发斐波那契堆的最坏情况复杂性?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 2012-12-29
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2010-12-19
      • 2010-11-24
      相关资源
      最近更新 更多