導航:首頁 > 源碼編譯 > kruskal演算法和prim區別

kruskal演算法和prim區別

發布時間:2022-10-30 09:11:49

A. 最小生成樹和哈夫曼樹有什麼區別

最短路徑和最小生成樹是不同的概念.
最短路徑是對於一個圖的兩個結點而言的.在一個圖中,結點A通過某些結點和邊可以走到結點B,那這些結點和邊就組成一條A到B的路徑,A到B的最短路徑就是A到B的所有路徑中邊權值總和最小的那一條(或多條).
最小生成樹是對於一個圖本身而言的.對於一個有n個結點的無向連通圖(邊沒有方向,任意兩點之間都存在路徑可以到達),必然可以去掉某些邊,使得最終剩下n-1條邊,並且n個結點仍然是連通的,這n個結點和n-1條邊組成了原圖的一個生成樹,而最小生成樹就是所有可能的生成樹中n-1條邊的權值總和最小的那一個(或多個).
最短路徑常用演算法有:floyd,dijkstra,SPFA,A*等
最小生成樹常用演算法有:prim,kruskal

B. prim和kruscal演算法得到的最小生成樹是否一樣

應該不一樣。可以用一個圖根據兩演算法試一下,若一樣,再修改圖,之後應該就可以了。
(網路或者查書本更加有效……)
構造G的最小生成樹的Prim演算法的基本思想是:首先置S={1},然後,只要S是V的真子集,就作如下的貪心選擇:選取滿足條件iS,jV-S,且c[i][j]最小的邊,將頂點j添加到S中。
這個過程一直進行到S=V時為止。
Kruskal演算法構造G的最小生成樹:將所有的邊按權從小到大排序。然後從第一條邊開始,依邊權遞增的順序查看每一條邊,並按下述方法連接2個不同的連通分支:當查看到第k條邊(v, w)時,如果端點v和w分別是當前2個不同的連通分支T1和T2中的頂點時,就用邊(v, w)將T1和T2連接成一個連通分支,然後繼續查看第k+1條邊;如果端點v和w在當前的同一個連通分支中,就直接再查看第k+1條邊。這個過程一直進行到只剩下一個連通分支時為止

C. Prim 演算法和 Kruskal 演算法

1).輸入:一個加權連通圖,其中頂點集合為V,邊集合為E;

2).初始化:Vnew = {x},其中x為集合V中的任一節點(起始點),Enew = {},為空;

3).重復下列操作,直到Vnew = V:

a.在集合E中選取權值最小的邊<u, v>,其中u為集合Vnew中的元素,而v不在Vnew集合當中,並且v∈V(如果存在有多條滿足前述條件即具有相同權值的邊,則可任意選取其中之一);

b.將v加入集合Vnew中,將<u, v>邊加入集合Enew中;

4).輸出:使用集合Vnew和Enew來描述所得到的最小生成樹。

反證法 :假設prim生成的不是最小生成樹

1).設prim生成的樹為G0

2).假設存在Gmin使得cost(Gmin)<cost(G0) 則在Gmin中存在<u,v>不屬於G0

3).將<u,v>加入G0中可得一個環,且<u,v>不是該環的最長邊(這是因為<u,v>∈Gmin)

4).這與prim每次生成最短邊矛盾

5).故假設不成立,命題得證.

1).記Graph中有v個頂點,e個邊

2).新建圖Graphnew,Graphnew中擁有原圖中相同的e個頂點,但沒有邊

3).將原圖Graph中所有e個邊按權值從小到大排序

4).循環:從權值最小的邊開始遍歷每條邊 直至圖Graph中所有的節點都在同一個連通分量中
如果這條邊連接的兩個節點於圖Graphnew中不在同一個連通分量中,添加這條邊到圖Graphnew中

歸納基礎:

n=1,顯然能夠找到最小生成樹。

歸納過程:

假設Kruskal演算法對n≤k階圖適用,那麼,在k+1階圖G中,我們把最短邊的兩個端點a和b做一個合並操作,即把u與v合為一個點v',把原來接在u和v的邊都接到v'上去,這樣就能夠得到一個k階圖G'(u,v的合並是k+1少一條邊),G'最小生成樹T'可以用Kruskal演算法得到。

我們證明T'+{<u,v>}是G的最小生成樹。

用反證法,如果T'+{<u,v>}不是最小生成樹,最小生成樹是T,即W(T)<W(T'+{<u,v>})。顯然T應該包含<u,v>,否則,可以用<u,v>加入到T中,形成一個環,刪除環上原有的任意一條邊,形成一棵更小權值的生成樹。而T-{<u,v>},是G'的生成樹。所以W(T-{<u,v>})<=W(T'),也就是W(T)<=W(T')+W(<u,v>)=W(T'+{<u,v>}),產生了矛盾。於是假設不成立,T'+{<u,v>}是G的最小生成樹,Kruskal演算法對k+1階圖也適用。

由數學歸納法,Kruskal演算法得證。

D. 如何用淺顯的語言解釋Kruskal演算法和Prim演算法

不嚴謹的說:將全集分為遍歷集合未遍歷集。兩種演算法都是遍歷集慢慢擴大為全集的過程。
Kruskal:集合中元素是邊,每次從未遍歷集中找一個最短邊,如果遍歷集包含它後不會構成迴路,就包含,重復過程直到所有點都連通。
Prim:集合中元素是點,每次從未遍歷集中找一個距離遍歷集距離最近的點,將其包含,重復過程直到包含所有點。
當然對於Kruskal,遍歷集並沒有擴展為全集,把全部邊都包含了也沒有意義了。

E. Kruskal演算法和Prim演算法構造它的一棵最小代價生成樹的過程

Prim演算法復雜度:O(n2), 與邊無關,適合求邊稠密的網的最小生成樹。

演算法思想:假設N={V,{E}}是連通網,TE是N上最小生成樹中邊的集合。演算法從U={u0},TE ={}開始,重復執行下述操作:在所有u∈U,v∈V-U的邊(u,v)∈E中找一條代價最小的邊(u0,v0)並入集合TE,同時v0並入U,直至U=V為止。

Kruskal演算法復雜度:O(eloge),相對於Prim而言,適合求邊稀疏的網的最小生成樹。

演算法思想:最小生成樹的初始狀態為只有n個頂點而無邊的非連通圖T=(V,{}),圖中每個頂點自成一個連通分量。在E中選擇代價最小的邊,若該邊依附的頂點落在T中不同的連通分量上,則將此邊加入到T中,否則捨去次邊而選擇下一條代價最小的邊。直至T中所有頂點都在同一連通分量上為止。

F. prim演算法和kruskal 演算法哪個好

Kruskal演算法適用於邊稀疏的情形,而Prim演算法適用於邊稠密的情形

G. prim演算法和kruskal演算法的區別

邊數較少可以用Kruskal,因為Kruskal演算法每次查找最短的邊。 邊數較多可以用Prim,因為它是每次加一個頂點,對邊數多的適用。

H. 13.用Prim演算法和Kruskal演算法構造圖的最小生成樹,所得到的最小生成樹是否相同

如果原來的圖裡面任何兩條邊長都不相同,那麼最小生成樹是唯一的,此時不管用什麼方法算出來的都是一樣的
但是如果圖里有相等的邊,那麼最小生成樹可能會不唯一,這樣就無法保證不同的方法得到同一棵樹(即使是同一個演算法,只要圖的編號方式改變也可能得到不同的最小生成樹)

I. KRUSKAL演算法和PRIM演算法

不是吧,網路白科裡面有這倆個演算法的詳細的講解,你可以去查查

J. prim演算法構造出的最小生成樹唯一嗎prim演算法和kruskal演算法構造出的最小生成樹一樣嗎

不唯一,兩種演算法構造出的最小生成不一定相同。

閱讀全文

與kruskal演算法和prim區別相關的資料

熱點內容
mdr軟體解壓和別人不一樣 瀏覽:884
單片機串列通信有什麼好處 瀏覽:320
游戲開發程序員書籍 瀏覽:843
pdf中圖片修改 瀏覽:269
匯編編譯後 瀏覽:474
php和java整合 瀏覽:829
js中執行php代碼 瀏覽:440
國產單片機廠商 瀏覽:57
蘋果手機怎麼設置不更新app軟體 瀏覽:284
轉行當程序員如何 瀏覽:492
蘋果id怎麼驗證app 瀏覽:864
查看手機命令 瀏覽:953
抖音反編譯地址 瀏覽:226
如何加密軟體oppoa5 瀏覽:233
java從入門到精通明日科技 瀏覽:96
拆解汽車解壓視頻 瀏覽:598
新版百度雲解壓縮 瀏覽:593
android上下拉刷新 瀏覽:880
centos可執行文件反編譯 瀏覽:839
林清玄pdf 瀏覽:271