1. 程式人生 > >關於Prim的堆優化

關於Prim的堆優化

生成樹 最小生成樹 並不會 最壞情況 開始 clas 沒有 font 一點

Prim的算法的具體思路是從某個點開始用貪心的策略向外擴展,找到離當前生成樹最近的節點加入樹中,並用該節點更新生成樹到其他節點的距離。顯然復雜度O(n^2),而且有一個二倍的常數(一共擴展n次,每次找最近的點是O(n)的,用該點更新其它點在稠密圖時也是O(n)的)。

然後某些大佬就想到可以用堆維護當前生成樹到各個節點的距離,然而其實這並不會快多少

首先我們假設是個稠密圖(稀疏圖盡量用kruskal),一共有n個節點要加入生成樹中,每個節點加入時又要更新生成樹到與之相連的點的距離,我們只是在找離生成樹最近的節點時才用到了堆,所以理想復雜度為O(n*(n+logn)),其實也就是O(n^2)。然後我們考慮堆中並不是只有n個節點(因為一個點可以重復入堆多次),所以最壞情況下堆中可能有接近(n^2/2)個節點,再加上堆的常數,就一點優勢都沒有了。

總結,求最小生成樹時稠密圖用prim,且無需堆優化,稀疏圖時能用kruskal就用,否則再考慮堆優化prim

關於Prim的堆優化