算法之「普里姆(Prim)算法」

普里姆算法

普里姆算法(Prim's algorithm)是圖中的一種算法,可在加權連通圖中搜索最小生成樹。算法

該算法的做用就是根據圖中權值找到鏈接全部頂點的最短路徑,也就是鏈接全部頂點的最小權值之和,也是這個加權圖中的最小生成樹。微信

普里姆算法步驟

1.選取權值最小邊的其中一個頂點做爲起始點。
2.找到離當前頂點權值最小的邊,並記錄該頂點爲已選擇。
3.重複第二步,直到找到全部頂點,就找到了圖的最小生成樹。數據結構

普里姆算法時間複雜度

假如咱們有 V 表示圖中的頂點個數,E 表示圖中的邊個數。3d

經過鄰接矩陣圖表示的簡易實現中,找到全部最小權邊共需 O(V^{2}) 的運行時間。cdn

使用簡單的二叉堆和鄰接表來表示的話,普里姆算法的運行時間則可縮減爲 O(E \log V )blog

若是使用較爲複雜的斐波那契堆,則可將運行時間進一步縮短爲 O(E+V \log V),這在連通圖足夠密集時,可較顯著地提升運行速度。it

普里姆算法示例

根據上面加權連通圖找到最小生成樹。io

首先選擇頂點 A 做爲起點。頂點 D、F、B 與 A 相連,且 AD 之間的權值最小,所以選擇這條邊。此時 A、D 爲已選擇頂點,E、F、B 爲待選擇頂點,H、G 爲未選擇頂點。

下一個頂點應選擇離 A、D 權值最小的頂點,所以選擇 AB 這條邊。此時 A、D、B 爲已選擇頂點,E、F、G 爲待選擇頂點,H 爲未選擇頂點。

下一個頂點應選擇離 A、D、B 權值最小的頂點,所以選擇 DE 這條邊。此時 A、D、B、E 爲已選擇頂點,F、G、H 爲待選擇頂點,沒有未選擇頂點。

下一個頂點應選擇離 A、D、B、E 權值最小的頂點,所以選擇 EH 這條邊。此時 A、D、B、E、H 爲已選擇頂點,F、G 爲待選擇頂點,沒有未選擇頂點。

下一個頂點應選擇離 A、D、B、E、H 權值最小的頂點,所以選擇 FH 這條邊。此時 A、D、B、E、H、F 爲已選擇頂點,G 爲待選擇頂點,沒有未選擇頂點。

最後,只剩下一個頂點 G,到頂點 G 的權值最小的是 HG。如今圖中全部頂點都鏈接了,紅色鏈接的邊就是最小生成樹,最小生成樹的權值之和爲 42。

總結

普里姆算法就是經過一個頂點擴散開找權值最小的邊,所通過的頂點和邊就是這個圖的最小生成樹。經過不用的數據結構存儲圖會致使時間複雜度不一致,用鄰接矩陣的時間複雜度是 O(V^{2}),二叉堆和鄰接表的時間複雜度是 O(E \log V )class

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

相關文章
相關標籤/搜索