如果使用邻接矩阵表示, 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}
修改
我想实现无效
答案 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)