Prim在O(| V | ^ 2)中的MST算法

时间:2010-08-06 06:25:03

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

如果使用邻接矩阵表示, 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)实现。
  5. 我想实现无效

3 个答案:

答案 0 :(得分:5)

找到成本最低的边缘( 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)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

我有一个实施here。它按顺序(A,B,Cost)读取垂直数(N),边数(M)和边数,然后输出边。这是Kruskal算法。

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