演算法分析與設計 實驗1-1Kruskal演算法
阿新 • • 發佈:2021-03-10
1、問題:
用Kruskal演算法來實現最小生成樹
2、解析:
Kruskal演算法在找最小生成樹結點之前,需要對邊權重從小到大進行排序。將排序好的權重邊依次加入到最小生成樹中(如果加入時產生迴路就跳過這條邊,加入下一條邊),當加入的邊數為n - 1條後,就找到了這個連通圖的最小生成樹。對於如何判斷有無迴路產生,採用並查集來判斷。
附上選擇邊的過程:
至此一棵最小生成樹就構建完成了。
3、設計(核心虛擬碼):
Sort(E + 1, E + 1 + m);
For(E : 1 ~ m) {
If(find(E[i].u) != find(E[i].v))){
Res += E[i].w;
Num++;
F[f1] = f2;
}
If(num = m - 1) break;
}
4、分析:
①、在並查集初始化階段時間複雜度為O(n)
②、在對邊進行從小到大的排序時間複雜度為O(mlogm)
③、在選擇邊的時候時間複雜度為O(m + n)
因為是順序執行,所以綜上所述Kruskal演算法時間複雜度為O(mlogm)