【问题标题】:How can a heap be used to optimizie Prim's minimum spanning tree algorithm?如何使用堆来优化 Prim 的最小生成树算法?
【发布时间】:2014-12-29 19:23:25
【问题描述】:

我必须解决一个类似这样的问题:
我得到一个数字 N,它代表我拥有的点数。每个点都有两个坐标:X 和 Y。

我可以通过以下公式找到两点之间的距离:
abs(x2-x1)+abs(y2-y1),
(x1,y1) 是第一个点的坐标,(x2,y2) 是第二个点的坐标,abs() 是绝对值。

我必须找到最小生成树,这意味着我必须将所有点与最小的边的总和连接起来。 Prim 的算法不错,但是太慢了。我读到我可以使用heap 使其更快,但我没有找到任何解释如何做到这一点的文章。

谁能解释一下 Prim 的算法如何与堆一起工作(一些示例代码会很好,但不是必须的),好吗?

【问题讨论】:

  • @kiss-o-matic 真的吗?
  • 所有点对之间是否有边?如果是这样,堆就没用了。
  • 是的,有。那为什么堆没用呢?
  • @ArifOzturk 因为时间复杂度是 O(E lg V)。如果E是O(V^2),那么就是O(V^2 lg V),比邻接矩阵的O(V^2)差。
  • 如果你真的希望这个速度很快,你应该在 L1 Delaunay 三角剖分上运行 Prim。

标签: algorithm graph-theory minimum-spanning-tree


【解决方案1】:

可以有效地解决这个问题(在O(n log n) 时间),但这并不容易。仅将 Prim 算法与堆一起使用并没有帮助(它实际上使它变得更慢),因为它的时间复杂度为 O(E log V),在本例中为 O(n^2 * log n)

但是,您可以使用 Delaunay 三角剖分来减少图中的边数。 Delaunay 三角剖分图是平面的,因此它具有线性数量的边。这就是为什么运行带有堆的 Prim 算法会给出O(n log n) 时间复杂度(有O(n) 边和n 顶点)。您可以在此处阅读更多相关信息(详细介绍此算法并证明其正确性会使我的答案太长):http://en.wikipedia.org/wiki/Euclidean_minimum_spanning_tree。请注意,尽管这篇文章是关于欧几里得 mst,但您的案例的方法基本相同(也可以有效地为曼哈顿距离构建 Delaunay 三角剖分)。

Prim 算法与堆本身的描述已经出现在您问题的其他两个答案中。

【讨论】:

    【解决方案2】:

    来自Prim's algorithm 上的维基百科文章:

    [S]toring 顶点而不是边可以进一步改进它。堆应按将顶点连接到部分构造的最小生成树 (MST) 中的任何顶点的最小边权重对顶点进行排序(如果不存在这样的边,则为无穷大)。每次选择一个顶点 v 并将其添加到 MST 时,都会对部分 MST 之外的所有顶点 w 执行减少键操作,使得 v 连接到 w,将键设置为其先前值和 (v,w) 的边缘成本中的最小值。

    【讨论】:

      【解决方案3】:

      虽然有人指出 Prim 的堆是 O(E log V),在最坏的情况下是 O(n^2 log n),但我可以提供在最坏的情况下使堆更快的原因案子,因为这还没有得到答复。

      Prim 在 O(V^2) 上的成本如此之高的原因是必须更新算法中的每次迭代。一般来说,Prim 的工作方式是为其他顶点保留一个长度最短的顶点表,然后选择最便宜的顶点添加到正在生长的树中,直到所有顶点都添加完毕。每次添加顶点时,都必须返回表并更新现在可以以较小权重访问的所有顶点。然后,您必须一直走回您的表格,以决定添加哪个顶点最便宜。这种设置 - 必须选择下一个顶点 (O(V)) V 次 - 给出 O(V^2)。

      堆能够帮助这个运行时间是除了最坏的情况之外的所有情况,因为它解决了这个瓶颈。通过使用最小堆,您可以访问 O(1) 中考虑的最小权重。此外,在向堆添加一个数字以维护其属性后,修复堆需要花费 O(log V),这需要 O(E log V) 次来维护 Prim 的堆。这成为了新的瓶颈,这就是导致 O(E log V) 最终运行时间的原因。

      因此,根据您对数据的了解程度,带堆的 Prim 肯定比不带堆的效率更高!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-16
        • 1970-01-01
        相关资源
        最近更新 更多