【问题标题】:Prim's MST algorithm in O(|V|^2)Prim 的 MST 算法 O(|V|^2)
【发布时间】:2011-03-26 04:30:08
【问题描述】:

如果使用邻接矩阵表示,Prim 的 MST 算法的时间复杂度为 O(|V|^2)

我正在尝试使用邻接矩阵来实现 Prim 算法。我正在使用this 作为参考。

V = {1,2...,n}
U = {1}
T = NULL
while V != U:

     /* 
         Now this implementation means that 
         I find lowest cost edge in O(n).
         How do I do that using adjacency list? 
     */

     let (u, v) be the lowest cost edge 
                such that u is in U and v is in V - U;

     T = T + {(u,v)}
     U = U + {v}

编辑:

  1. 我非常了解 Prim 的算法。
  2. 我知道如何使用堆和优先级队列有效地实现它。
  3. 我也知道更好的算法。
  4. 我想使用图的邻接矩阵表示并获得 O(|V|^2) 实现。

我想要低效的实现

【问题讨论】:

标签: algorithm data-structures language-agnostic implementation prims-algorithm


【解决方案1】:

寻找成本最低的边(u,v),使得u在U中,v在 VU 中,通过 优先队列 完成。更准确地说,优先级队列包含来自 VU 的每个节点 v 以及从 v 到当前树 U 的最低成本边。换句话说,队列正好包含 |VU |元素。

在向 U 添加新节点 u 后,您必须通过检查 u 的相邻节点现在是否可以通过较低的边到达来更新优先级队列比以前更贵。

优先级队列的选择决定了时间复杂度。通过将优先级队列实现为简单的数组cheapest_edges[1..|V|],您将获得 O(|V|^2)。那是因为在这个队列中找到最小值需要 O(|V|) 时间,然后你重复 |V|次。

在伪代码中:

V = {2...,n}
U = {1}
T = NULL
P = array, for each v set P[v] = (1,v)

while V != U

    (u,v) = P[v] with v such that  length P[v]  is minimal

    T = T + {(u,v)}
    U = U + {v}

    for each w adjacent to v
        if length (v,w) < length P[w] then
            P[w] = (v,w)

【讨论】:

    【解决方案2】:

    您可以像在Dijkstra's algorithm 中一样执行此操作,方法是选择以最小成本边(不生成循环)连接到当前部分树的节点。我认为wikipedia 比您拥有的伪代码更好地解释了 Prim。看一看,如果您有更多问题,请告诉我。

    【讨论】:

    • 问题是不理解算法。我很好理解。问题是没有有效的实施。有许多使用优先级队列。问题是我如何以 O(|V|^2) 的复杂度来实现它。
    【解决方案3】:

    您可以按成本对边进行排序,然后按成本的顺序对边进行迭代,如果该边连接两个不同的子图,则使用该边。

    我有一个实现here。它依次读取顶点数(N)、边数(M)和边(A,B,Cost),然后输出边。这是克鲁斯卡尔算法。

    可以在here找到使用相同输入的 Prim 算法的堆实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多