- Prim:一種在連通、無向、加權圖中獲得最小生成樹(MST)的演算法,旨在最小化邊權重總和。
- 操作:從一個節點開始,透過迭代地選擇連接已處理節點和未處理節點的權重最低的邊來擴展樹,避免循環。
- 複雜度:使用鄰接矩陣時為 O(n²),使用堆時為 O(a log n);Prim 演算法在稠密圖上通常比 Kruskal 演算法更好。
- 應用領域:網路設計、電力系統、水/氣分配、機器視覺和生物資訊學、成本和資源優化。

Prim 演算法是解決最小生成樹(MST) 問題最常用的方法之一。這類問題廣泛應用於電信網路、電力系統和配電網路等諸多領域。如果您想深入了解演算法的工作原理,那麼這篇文章正是您所需要的。我們將從 Prim 演算法的歷史、技術實現到實際應用,全面解析它。
儘管該演算法最初由羅伯特·普里姆於 1957 年提出,但其重要性並未隨時間推移而降低。它是圖分析中必不可少的演算法,尤其是在尋找以最低成本連接圖中所有節點的有效方案時。此外,由於其易於實現,因此非常適合在我們面向程式設計師的綜合指南中學習圖優化技術。
什麼是 Prim 演算法?
Prim 演算法是一種用來尋找連通、無向、加權圖的最小生成樹(MST) 的技術。最小生成樹是一棵連結圖中所有節點且邊權重總和最小的樹。這個問題在網路優化等領域至關重要,因為它有助於最大限度地減少電纜、管道甚至運輸路線等資源的使用。
此演算法的主要想法是將圖的節點分為兩組:已處理節點和未處理節點。然後,迭代地選擇連接這兩組節點的最短邊,同時確保不形成環路。最終,所選邊的集合構成圖的最小生成樹(MST)。
歷史和背景
Robert Prim 於 1957 年開發了該演算法,但其起源可以追溯到更早的 1926 年,當時Otakar Boruvka在捷克斯洛伐克研究電氣化問題。同樣在 1956 年,Joseph Kruskal提出了他自己的最小生成樹問題解法。雖然這兩個演算法都解決了同一個問題,但 Prim 的演算法對於稠密圖尤其有效。
在 1960 年代和 1970 年代,貝爾實驗室的數學家們對該演算法進行了研究和改進,為組合最佳化問題的高級技術發展做出了貢獻。
演算法運行
演算法首先選擇圖中的任意初始節點,並將其邊添加到可能的連接集合中。然後,在每個步驟中:
- 選擇已做出 最短邊 將已處理的節點與未處理的節點連接。
- 將選定邊連接的未處理節點標記為已處理。
- 該過程持續進行,直到所有節點都被處理。
最終的邊集構成最小生成樹,與其他方法(如威爾遜演算法)相關。
複雜度以及與 Kruskal 的比較
Prim 演算法最受關注的方面之一是其效率。在一個具有n 個節點和n 條邊的圖中,其複雜度會根據實現方式的不同而改變:
- 使用鄰接矩陣: O(n²)
- 使用土墩: O(log n)
相較之下,Kruskal 演算法的複雜度為O(a log n),但這取決於所使用的排序方法。 Prim 演算法通常對稠密圖更有效率,而 Kruskal 演算法更適用於稀疏圖。
演算法偽代碼
理解該演算法的一個清晰方法是透過其偽代碼和數學演算法範例:
Prim(圖):從初始節點開始處理集合,當存在未處理的節點:找到連接兩個集合的最短邊,將邊添加到 MST,將節點標記為已處理,返回 MST
實際應用
Prim 的演算法在現實世界中有多種用途,包括:
- 電信網路設計:確定連接伺服器或基地台網路最有效的方式。
- 電氣系統:降低電氣裝置佈線成本。
- 水或氣的分配:優化管道基礎設施。
例如,有線電視公司可以使用該演算法來最小化連接住宅區所有客戶所需的電纜長度。
它也被應用於更複雜的領域,例如電腦視覺中的圖像分析、生物資訊學中的蛋白質折疊,以及解決NP難題(例如旅行商問題)的方法。
由於其多功能性和適應性,Prim 演算法仍然是圖相關問題最佳化中的基本工具。