【问题标题】:The fastest minimum spanning tree algorithm最快的最小生成树算法
【发布时间】:2011-02-07 17:16:04
【问题描述】:

http://en.wikipedia.org/wiki/Minimum_spanning_tree

我希望将我的最小生成树算法与最佳中的最佳算法进行基准测试。 有人知道我在哪里可以找到这些算法的 C++ 实现吗?我用谷歌搜索并没有找到任何东西。如果这些算法是最好的,那么肯定在某个地方一定有 C++ 实现吗?

最快的最小生成树 迄今为止的算法是由 大卫·卡格、菲利普·克莱因和罗伯特 Tarjan,他发现了一个线性时间 基于随机算法 Borůvka 算法和 反向删除算法。[2][3] 最快的非随机算法, 由 Bernard Chazelle 所著,基于 软堆,近似优先级 队列。[4][5]它的运行时间是O(m α(m,n)),其中 m 是 边,n 是顶点的数量,并且 α 是经典的反函数 阿克曼函数。这 函数 α 增长非常缓慢,所以 出于所有实际目的,它可以 被认为是一个不大于常数 超过 4 个;因此 Chazelle 算法 需要非常接近线性时间。如果 边权重是整数 有界位长度,然后是确定性的 算法是已知的线性 运行时间。[6]是否存在 具有线性的确定性算法 一般权重的运行时间是 仍然是一个悬而未决的问题。然而,赛斯 Petie 和 Vijaya Ramachandran 找到了一个可证明的最优确定性 最小生成树算法 计算复杂度为 未知。[7]

我已经针对 Boost C++ 的图形算法进行了测试。

【问题讨论】:

    标签: c++ minimum-spanning-tree


    【解决方案1】:

    当维基百科页面说“最快的最小生成树算法”时,他们的意思是具有最低渐近边界的算法——在这种情况下,O(m α(m,n)),m, n,和 α 在您粘贴的报价中定义。简而言之,这意味着对于非常大的输入值,对于某些 C 值,所花费的时间将始终以 C*m*α(m,n) 为界。但请注意,C 可能非常大——即,当应用于较小的输入值时,此算法可能会比其他算法慢,即使对于非常大的输入值它比其他算法更快。

    在比较两种算法的渐近界时,没有“测试”来查看哪个更快 - 您只需证明每种算法的渐近界,然后看看哪个更小。 (“渐近”是指输入大小趋于无穷大时的行为——并且很难使用无限大小的输入值运行测试。)

    但请注意,在某些情况下您应该使用渐近最快的算法。如果“C”非常大,那么对于较小的数据值,您最好使用更简单的算法。

    我的猜测是您的算法可能会在 C 上有所改进,但不会在渐近界上有所改进。但是,如果我错了,那么您应该将其提交给 ACM!

    欲了解更多信息,请参阅:http://en.wikipedia.org/wiki/Big_O_notation

    【讨论】:

    • 很好的答案。您应该补充一点,有时 Big O 还带有一些警告,例如哈希表的情况以及它们对“好”哈希函数的依赖。虽然我们在这里不讨论散列函数,但同样的事情也可能发生在不相交的树等上。
    • 所以没有代码!没有实验结果!我喜欢的科学方法在哪里:)
    【解决方案2】:

    "On Sorting, Heaps, and Minimum Spanning Trees", Gonzalo Navarro and Rodrigo Paredes

    展示了一些“最佳中的最佳”核心和外部 内存测量,并提供对较旧的参考 实现。

    他们将 I/O 数量和 CPU 时间报告为 图大小,并很好地描述他们的测试用例,所以 原则上你可以做测试并与 他们发布的图表。您可以使用他们的 Prim2 参考(来自 Peter Sanders 的代码,他制作了许多 他的快速代码免费提供)来校准 自己测量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多