算法導(dǎo)論--最小生成樹
最小生成樹:在連通網(wǎng)的所有生成樹中,所有邊的代價(jià)和最小的生成樹,稱為最小生成樹。
1.Kruskal算法
此算法可以稱為“加邊法”,初始最小生成樹邊數(shù)為0,每迭代一次就選擇一條滿足條件的最小代價(jià)邊,加入到最小生成樹的邊集合里。
- 把圖中的所有邊按代價(jià)從小到大排序;
- 把圖中的n個(gè)頂點(diǎn)看成獨(dú)立的n棵樹組成的森林;
- 按權(quán)值從小到大選擇邊,所選的邊連接的兩個(gè)頂點(diǎn)ui,viui,vi,應(yīng)屬于兩顆不同的樹,則成為最小生成樹的一條邊,并將這兩顆樹合并作為一顆樹。
-
重復(fù)(3),直到所有頂點(diǎn)都在一顆樹內(nèi)或者有n-1條邊為止。
image.png
Prim算法
此算法可以稱為“加點(diǎn)法”,每次迭代選擇代價(jià)最小的邊對應(yīng)的點(diǎn),加入到最小生成樹中。算法從某一個(gè)頂點(diǎn)s開始,逐漸長大覆蓋整個(gè)連通網(wǎng)的所有頂點(diǎn)。
1.圖的所有頂點(diǎn)集合為VV;初始令集合u={s},v=V?uu={s},v=V?u;
2.在兩個(gè)集合u,vu,v能夠組成的邊中,選擇一條代價(jià)最小的邊(u0,v0)(u0,v0),加入到最小生成樹中,并把v0v0并入到集合u中。
3.重復(fù)上述步驟,直到最小生成樹有n-1條邊或者n個(gè)頂點(diǎn)為止。
哈夫曼樹
哈夫曼樹又稱最優(yōu)二叉樹。它是 n 個(gè)帶權(quán)葉子結(jié)點(diǎn)構(gòu)成的所有二叉樹中,帶權(quán)路徑長度 WPL 最小的二叉樹。
假設(shè)有n個(gè)權(quán)值,則構(gòu)造出的哈夫曼樹有n個(gè)葉子結(jié)點(diǎn)。 n個(gè)權(quán)值分別設(shè)為 w1、w2、…、wn,則哈夫曼樹的構(gòu)造規(guī)則為:
(1) 將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有一個(gè)結(jié)點(diǎn));
(2) 在森林中選出兩個(gè)根結(jié)點(diǎn)的權(quán)值最小的樹合并,作為一棵新樹的左、右子樹,且新樹的根結(jié)點(diǎn)權(quán)值為其左、右子樹根結(jié)點(diǎn)權(quán)值之和;
(3)從森林中刪除選取的兩棵樹,并將新樹加入森林;
(4)重復(fù)(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。
注意:為了使得到的哈夫曼樹的結(jié)構(gòu)盡量唯一,通常規(guī)定生成的哈夫曼樹中每個(gè)結(jié)點(diǎn)的左子樹根結(jié)點(diǎn)的權(quán)小于等于右子樹根結(jié)點(diǎn)的權(quán)。
哈夫曼編碼
在電報(bào)通信中,電文是以二進(jìn)制的0、1序列傳送的,每個(gè)字符對應(yīng)一個(gè)二進(jìn)制編碼,為了縮短電文的總長度,采用不等長編碼方式,構(gòu)造哈夫曼樹,
將每個(gè)字符的出現(xiàn)頻率作為字符結(jié)點(diǎn)的權(quán)值賦予葉子結(jié)點(diǎn),每個(gè)分支結(jié)點(diǎn)的左右分支分別用0和1編碼,從樹根結(jié)點(diǎn)到每個(gè)葉子結(jié)點(diǎn)的路徑上
所經(jīng)分支的0、1編碼序列等于該葉子結(jié)點(diǎn)的二進(jìn)制編碼。如上文所示的哈夫曼編碼如下:
最短路徑問題---Dijkstra算法
最短路徑問題介紹
問題解釋:
從圖中的某個(gè)頂點(diǎn)出發(fā)到達(dá)另外一個(gè)頂點(diǎn)的所經(jīng)過的邊的權(quán)重和最小的一條路徑,稱為最短路徑。
初始狀態(tài):S是已計(jì)算出最短路徑的頂點(diǎn)集合,U是未計(jì)算除最短路徑的頂點(diǎn)的集合!
第1步:將頂點(diǎn)D加入到S中。
此時(shí),S={D(0)}, U={A(∞),B(∞),C(3),E(4),F(∞),G(∞)}。 注:C(3)表示C到起點(diǎn)D的距離是3。
第2步:將頂點(diǎn)C加入到S中。
上一步操作之后,U中頂點(diǎn)C到起點(diǎn)D的距離最短;因此,將C加入到S中,同時(shí)更新U中頂點(diǎn)的距離。以頂點(diǎn)F為例,之前F到D的距離為∞;但是將C加入到S之后,F(xiàn)到D的距離為9=(F,C)+(C,D)。
此時(shí),S={D(0),C(3)}, U={A(∞),B(23),E(4),F(9),G(∞)}。
第3步:將頂點(diǎn)E加入到S中。
上一步操作之后,U中頂點(diǎn)E到起點(diǎn)D的距離最短;因此,將E加入到S中,同時(shí)更新U中頂點(diǎn)的距離。還是以頂點(diǎn)F為例,之前F到D的距離為9;但是將E加入到S之后,F(xiàn)到D的距離為6=(F,E)+(E,D)。
此時(shí),S={D(0),C(3),E(4)}, U={A(∞),B(23),F(6),G(12)}。
第4步:將頂點(diǎn)F加入到S中。
此時(shí),S={D(0),C(3),E(4),F(6)}, U={A(22),B(13),G(12)}。
第5步:將頂點(diǎn)G加入到S中。
此時(shí),S={D(0),C(3),E(4),F(6),G(12)}, U={A(22),B(13)}。
第6步:將頂點(diǎn)B加入到S中。
此時(shí),S={D(0),C(3),E(4),F(6),G(12),B(13)}, U={A(22)}。
第7步:將頂點(diǎn)A加入到S中。
此時(shí),S={D(0),C(3),E(4),F(6),G(12),B(13),A(22)}。
此時(shí),起點(diǎn)D到各個(gè)頂點(diǎn)的最短距離就計(jì)算出來了:A(22) B(13) C(3) D(0) E(4) F(6) G(12)。