Kruskal 演算法是一種用來尋找 MST(minimum spanning tree) 的演算法,由 Joseph Kruskal 在1956年發表。用來解決同樣問題的還有 Prim演算法 和 Boruvka演算法等。三種演算法都是 貪婪演算法 的應用。和 Boruvka演算法 不同的地方是,Kruskal演算法 在圖中存在相同權值的邊時也有效.
Description:
一般常見的 MST 演算法會採用下面的 pseudo code:
- GENERIC-MST(G,w)
- while A does not form a spanning tree
- find an edge (u,v) that is safe for A
- A=A⋃{(u,v)}
- return A
也就是說這個 pseudo code 會:
Kruskal’s algorithm:
要開始講這個演算法前, 為了要看懂它的 pseudo code, 先要來知道會用到的 routine:
接著是該演算法的 pseudo code:
- MST-KRUSKAL(G,w)
- A={}
- for each vertex v∈G.V
- MAKE-SET(v)
- sort G.E by w
- for each edge (u,v) ∈G.E
- if FIND-SET(u)≠FIND-SET(v)
- A=A⋃{(u,v)}
- UNION(u,v)
- return A
Example:
接著我們來看一個範例, 考慮有 Graph 如下:
1. Sorting 過後, 第一個取出來的 edge(0,5). 因為 vertex 0, 5 分屬不同的 set, 故將此 edge 加到 A
2. 接著第二個取出來的 edge(2,3). 因為 vertex 2, 3 分屬不同的 set, 故將此 edge 加到 A
3. 接著第三個取出來的 edge(1,6). 因為 vertex 1, 6 分屬不同的 set, 故將此 edge 加到 A
4. 接著第四個取出來的 edge(1,2). 因為 vertex 1, 2 分屬不同的 set, 故將此 edge 加到 A
5. 接著第五個取出來的 edge(3,6). 因為 vertex 3, 6 屬於同一個 set {(1,2), (1,6), (2,3)}, 故捨棄此 edge!
6. 接著第六個取出來的 edge(3,4). 因為 vertex 3, 4 分屬不同的 set, 故將此 edge 加到 A
7. 接著第七個取出來的 edge(4,6). 因為 vertex 4, 6 屬於同一個 set {(1,2), (1,6), (2,3), (3,4)}, 故捨棄此 edge!
8. 接著第八個取出來的 edge(4,5). 因為 vertex 4, 5 分屬不同的 set, 故將此 edge 加到 A; 且此時 A 有 6 個 edges = |V|-1. 故 MST 已經完成!
Supplement:
* [ Alg info ] Borůvka's algorithm (MST)
* [ Data Structures with Java ] Section 25.6 : Minimum Spanning Tree
* [ 資料結構 小學堂 ] 圖形結構 : 擴張樹 (Prim)
* [ 資料結構 小學堂 ] 圖形結構 : 擴張樹 - 求最小成本擴張樹 (Kruskal 演算法)