算法之「克魯斯克爾(Kruskal)算法」

克魯斯克爾算法

克魯斯克爾算法(Kruskal's algorithm)跟普里姆算法同樣,是一種用來查找最小生成樹的算法,但算法的實現不同,它是經過對權值從小到大順序排列來查找最小生成樹的。算法

克魯斯克爾算法步驟

1.將原圖中全部的邊按權值從小到大排序。微信

2.從權值最小的邊開始,若是這條邊鏈接的兩個節點於圖中不在同一個已鏈接的邊中,則記錄該頂點爲已選擇。3d

3.重複步驟2,直至圖中全部的節點都連通,就找到了連通圖的最小生成樹。cdn

克魯斯克爾算法時間複雜度

假如咱們有 V 表示圖中的頂點數,E 表示圖中的邊數。平均時間複雜度爲 O(E \log V )blog

克魯斯克爾算法示例

用克魯斯克爾算法找到加權連通圖的最小生成樹。

經過對圖中全部邊的權值進行排序,獲得 AD 邊的權值最小爲 5,並高亮標記。

而後下一條權值最小的邊是 FH,權值爲 6,並高亮標記。(注意不要構成環)

而後下一條權值最小的邊有兩條 AB 和 EH,權值爲 7,咱們任意選一條邊 AB,並高亮標記。(注意不要構成環)

而後下一條權值最小的邊是 EH,權值爲 7,並高亮標記。(注意不要構成環)

而後下一條權值最小的邊是 HG,權值爲 8,並高亮標記。(注意不要構成環)

最後一條權值最小的邊是 DE,權值爲 9,並高亮標記。如今圖中全部頂點都鏈接了,紅色鏈接的邊就是最小生成樹,最小生成樹的權值之和爲 42。

注意:在權值相同的邊,咱們能夠任意選擇一條邊,但選擇的邊不能跟之前的邊構成環。若是當權值最小的邊跟已選擇的邊構成了環,就跳過當前的邊,繼續下一條權值最小的邊。排序

總結

克魯斯克爾算法跟普里姆算法同樣,是一種用來查找最小生成樹的算法。it

對比兩個算法,克魯斯卡爾算法主要是針對邊來展開,邊數少時效率會很是高,因此對於稀疏圖有很大的優點;而普里姆算法對於稠密圖,即邊數很是多的狀況會更好一些。io

PS:
清山綠水始於塵,博學多識貴於勤。
我有酒,你有故事嗎?
微信公衆號:「清塵閒聊」。
歡迎一塊兒談天說地,聊代碼。class

相關文章
相關標籤/搜索