經典樹與圖論(最小生成樹、哈夫曼樹、最短路徑問題---Dijkstra算法)


參考網址: https://www.jianshu.com/p/cb5af6b5096d

算法導論--最小生成樹

最小生成樹:在連通網的所有生成樹中,所有邊的代價和最小的生成樹,稱為最小生成樹。

image.png

1.Kruskal算法
此算法可以稱為“加邊法”,初始最小生成樹邊數為0,每迭代一次就選擇一條滿足條件的最小代價邊,加入到最小生成樹的邊集合里。

  1. 把圖中的所有邊按代價從小到大排序;
  2. 把圖中的n個頂點看成獨立的n棵樹組成的森林;
  3. 按權值從小到大選擇邊,所選的邊連接的兩個頂點ui,viui,vi,應屬於兩顆不同的樹,則成為最小生成樹的一條邊,並將這兩顆樹合並作為一顆樹。
  4. 重復(3),直到所有頂點都在一顆樹內或者有n-1條邊為止。


     

     

     

    image.png

Prim算法
此算法可以稱為“加點法”,每次迭代選擇代價最小的邊對應的點,加入到最小生成樹中。算法從某一個頂點s開始,逐漸長大覆蓋整個連通網的所有頂點。

1.圖的所有頂點集合為VV;初始令集合u={s},v=V−uu={s},v=V−u;
2.在兩個集合u,vu,v能夠組成的邊中,選擇一條代價最小的邊(u0,v0)(u0,v0),加入到最小生成樹中,並把v0v0並入到集合u中。
3.重復上述步驟,直到最小生成樹有n-1條邊或者n個頂點為止。


 

 

 

 
image.png

哈夫曼樹

哈夫曼樹又稱最優二叉樹。它是 n 個帶權葉子結點構成的所有二叉樹中,帶權路徑長度 WPL 最小的二叉樹。

假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 w1、w2、…、wn,則哈夫曼樹的構造規則為:
(1) 將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有一個結點);
(2) 在森林中選出兩個根結點的權值最小的樹合並,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;
(3)從森林中刪除選取的兩棵樹,並將新樹加入森林;
(4)重復(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。


 

 

 

image.png

注意:為了使得到的哈夫曼樹的結構盡量唯一,通常規定生成的哈夫曼樹中每個結點的左子樹根結點的權小於等於右子樹根結點的權。

哈夫曼編碼

在電報通信中,電文是以二進制的0、1序列傳送的,每個字符對應一個二進制編碼,為了縮短電文的總長度,采用不等長編碼方式,構造哈夫曼樹,
將每個字符的出現頻率作為字符結點的權值賦予葉子結點,每個分支結點的左右分支分別用0和1編碼,從樹根結點到每個葉子結點的路徑上
所經分支的0、1編碼序列等於該葉子結點的二進制編碼。如上文所示的哈夫曼編碼如下:


 

 

 

image.png

最短路徑問題---Dijkstra算法

最短路徑問題介紹
問題解釋:
從圖中的某個頂點出發到達另外一個頂點的所經過的邊的權重和最小的一條路徑,稱為最短路徑。


 

 

 

 
image.png

初始狀態:S是已計算出最短路徑的頂點集合,U是未計算除最短路徑的頂點的集合!
第1步:將頂點D加入到S中。
此時,S={D(0)}, U={A(∞),B(∞),C(3),E(4),F(∞),G(∞)}。 注:C(3)表示C到起點D的距離是3。

第2步:將頂點C加入到S中。
上一步操作之后,U中頂點C到起點D的距離最短;因此,將C加入到S中,同時更新U中頂點的距離。以頂點F為例,之前F到D的距離為∞;但是將C加入到S之后,F到D的距離為9=(F,C)+(C,D)。
此時,S={D(0),C(3)}, U={A(∞),B(23),E(4),F(9),G(∞)}。

第3步:將頂點E加入到S中。
上一步操作之后,U中頂點E到起點D的距離最短;因此,將E加入到S中,同時更新U中頂點的距離。還是以頂點F為例,之前F到D的距離為9;但是將E加入到S之后,F到D的距離為6=(F,E)+(E,D)。
此時,S={D(0),C(3),E(4)}, U={A(∞),B(23),F(6),G(12)}。

第4步:將頂點F加入到S中。
此時,S={D(0),C(3),E(4),F(6)}, U={A(22),B(13),G(12)}。

第5步:將頂點G加入到S中。
此時,S={D(0),C(3),E(4),F(6),G(12)}, U={A(22),B(13)}。

第6步:將頂點B加入到S中。
此時,S={D(0),C(3),E(4),F(6),G(12),B(13)}, U={A(22)}。

第7步:將頂點A加入到S中。
此時,S={D(0),C(3),E(4),F(6),G(12),B(13),A(22)}。

此時,起點D到各個頂點的最短距離就計算出來了:A(22) B(13) C(3) D(0) E(4) F(6) G(12)。



作者:第六象限
鏈接:https://www.jianshu.com/p/cb5af6b5096d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM