普里姆演算法是構造連通網的最小生成樹的演算法之一。理解普里姆演算法的關鍵就是要明確兩個陣列是用來幹什麼的,這兩個陣列分別是:lowcost和adjvex。lowcost[j]的意思是頂點j和已經在生成樹內的頂點集合內的某個頂點的最小權值。這個已經在生成樹內且與頂點j對應的頂點,就記錄在
adjvex[j]
中。把adjvex[j]和lowcost[j]對應起來的意思就是:已經屬於生成樹的頂點adjvex[j]和未加入生成樹的頂點j的組成的邊的權值就是lowcost[j]。
如下圖所示:
之後就是迴圈計算已經加入生成樹中的頂點與未加入生成樹的頂點的權值,然後,取出權值最小的頂點加入生成樹中,之後再以最新加入的頂點與未加入生成樹的鄰接點的權值是否小於原先頂點j的權值來更新lowcost陣列。例如:原先lowcost[4]的權值是15且頂點4被權值為10的點3搶走了加入生成樹的機會(假設點4與點3都與點1相連,且點3與點4相連),若此時,點3與點4的權值小於原來的lowcost[4]的15,比如說是10,那麼lowcost[4]的值就會被更新為10,而且adjvex[4]的值也要同時更新為3。如下圖所示:
粗略的流程:
①已存在生成樹中的頂點:1。未存在生成樹中的頂點:2、3、4。此時的lowcost陣列的情況:lowcost[1]=0,lowcost[2]=20,lowcost[3]=10,lowcost[4]=15.由此可以判斷下乙個加入生成樹的頂點是頂點3.
②已存在生成樹中的頂點:1、3。未存在生成樹中的頂點:2、4。此時的lowcost陣列的情況:lowcost[1]=0,lowcost[2]=20,lowcost[3]=0,lowcost[4]=10。
這裡就出現了上面說的情況,因為在生成樹中的頂點目前有頂點1和頂點3,而在頂點3的鄰接點集合中且未加入生成樹的權值最小的頂點就是頂點4,而頂點4到頂點1的權值明顯比3到4要大,所以,這裡就需要更新lowcost[4]的值了,並且要修改相對應的adjvex[4]的值。
通過不斷的更新lowcost陣列的值,和取出lowcost陣列的最小值後賦值為0來代表頂點加入生成樹來完成生成樹的構造。
生動的普里姆演算法詳解
針對無向圖用來生成最小生成樹的演算法。起始條件 讓我們來系統的執行一次 乙個孤苦伶仃的起始點小明看著周圍的點點們都不和自己在乙個集合裡,於是很想找同伴,但是怎麼找呢?它發現,自己和一些點身上綁著一條線 距離為線的權值 而和另一部分點則沒有連線 距離為inf 這些全都儲存在陣列a裡,a 連線的點 權值...
對booth演算法的一點理解
最近學到了booth演算法,不太理解,看了網上很多解釋,感覺wiki和知乎的乙個回答裡解釋的比較好 在這裡寫一點我自己的理解 乙個用的比較多的解釋booth演算法的例子是 0011 1100 它可以寫成0100 0000 0000 0010 為了方便理解我們可以在表示中引進 1,這樣就可以寫成010...
對raft演算法的一點理解
raft演算法的目的及工作過程 raft演算法是為了保證在超過半數的伺服器正常工作的情況下仍然可以達成一致,像乙個整體一樣工作,並且一少部分慢的機器不會影響系統的整體效能的一致性演算法。raft演算法開始時在集群中選舉出領導人負責日誌複製的管理,領導人接受來自客戶端的請求並把該日誌複製給集群中的其它...