Day 23:最小生成樹(MST) - iT 邦幫忙
文章推薦指數: 80 %
Kruskal演算法的方式是從所有邊中,反覆選擇最短的邊,它的步驟是: ... 如下圖,先將邊排序,依序選擇,其中邊be即是因為會形成環所以不選。
2021iThome鐵人賽
DAY
23
0
自我挑戰組
30天不怕演算法:白話文版系列第
23篇
Day23:最小生成樹(MST)
13th鐵人賽
演算法
salmon_simpson
2021-10-0612:37:56635瀏覽
貪婪演算法可以解決的一個問題就是找到一張圖中的最小生成樹(minimumspanningtree)。
樹、生成樹與最小生成樹
我們之前提到資料結構中的樹是有根樹(rootedtree),也就是樹中有一個根節點。
但其實樹不一定都有根節點,只要任意兩節點都有(也只有)一條邊相連的圖就稱作樹。
圖片來源:維基百科
而一個圖中的生成樹(spanningtree),就是指連接該圖所有節點的樹,一個圖可能有不只一個生成樹。
而最小生成樹就是指在有權圖中,權重總和最小的生成樹。
例如下圖中綠色的部分,就是這個圖的最小生成樹。
圖片來源:維基百科
那麼最小生成樹可以解決什麼問題呢?其中一種最直接的應用是線路設計,例如沿著街道(邊)為住家(節點)架設電纜的情境,最小生成樹可以作為成本最低的路徑。
另外,最小生成樹也可以用來作為困難問題的近似解,或間接應用在人臉或字跡辨識等技術中。
貪婪解法
有許多演算法可以找到一個圖中的最小生成樹,下面寫到的幾種都是屬於貪婪演算法。
這幾種方法雖然關注點或出發點不同,但同樣都是用貪婪策略,每一階段都選擇局部最佳解,以達到最終的整體最佳解。
也表現出之前提到的,一個問題可能以多種貪婪演算法解決。
Prim'salgorithm
普林演算法的策略與先前提到尋找最短路徑的Dijkstra演算法非常相似(事實上這個演算法也被Dijkstra再次發現與發表,所以也稱為Prim–Dijkstraalgorithm),它的作法是:
先將任意節點加入到樹之中。
選擇與樹距離最近的節點,加入到樹中,反覆此步驟直到所有節點均在樹中,即為最小生成樹。
以上方的圖為例,如果一開始選擇G節點,接下來將最近的節點E加入樹中,接下來將與G或E最近的節點C加入...以此類推,也就是每一階段樹都會納入距離最近的節點、增加一條邊,直到連接所有的節點。
Kruskal'salgorithm
Kruskal演算法的方式是從所有邊中,反覆選擇最短的邊,它的步驟是:
將所有的邊依照權重由小到大排序。
從最小開始,選擇不會形成環的邊,直到連接所有節點。
如下圖,先將邊排序,依序選擇,其中邊be即是因為會形成環所以不選。
圖片來源:維基百科
Borůvka'salgorithm
Borůvka演算法則是利用節點的最短邊得出多棵樹,再將樹以最短邊相連:
找尋每個節點的最短邊,可以重複選擇(例如下圖AC同時是A節點和C節點的最短邊),如此一來會形成幾個不相連的樹,如下圖中經過第一步驟後得到AC、BD、EF等不同的樹,以不同顏色標示。
以同樣的方式,反覆找尋每個樹的最短邊,每次操作樹的數量都會減少,直到最終只剩下一個樹即為最小生成樹。
圖片來源:維基百科
留言
追蹤
檢舉
上一篇
Day22:貪婪演算法(2)
下一篇
Day24:霍夫曼編碼(Huffmancoding)
系列文
30天不怕演算法:白話文版
共30篇
目錄
RSS系列文
訂閱系列文
5人訂閱
26
Day26:旅行推銷員問題(TSP)
27
Day27:碰到困難問題,演算法也救不了?
28
Day28:Diffie–Hellman演算法
29
Day29:K-近鄰演算法(k-nearestneighbors)
30
Day30:寫在不怕演算法之後
完整目錄
尚未有邦友留言
立即登入留言
iT邦幫忙鐵人賽
參賽組數
1087組
團體組數
52組
累計文章數
20485篇
完賽人數
572人
鐵人賽最新文章
資料驗證(golang)(Day23)
.NetCoreWebApi_筆記22_Swagger自訂文件並讀取API註解描述
[Day??]2021iThome鐵人賽-頒獎典禮@2022.01.08‧輔仁大學
[Day33]HexoxNexT-顯示最新文章、導入GoogleAnalytics的坑
【Day31】新加坡工作後續的時程
重構原本的內容(golang)(Day22)
Laravel-jQueryAJAX範例
2022/1/2更新
.NetCoreWebApi_筆記21_Swagger及OpenAPI介紹與配置使用方式_API管理與測試探討
.NetCoreWebApi_筆記20_api結合ADO.NET資料庫操作part8_新聞文章查詢
前往鐵人賽
技術推廣專區
[Day2]抓取每日收盤價
[Day1]基本工具安裝
利用python取得永豐銀行API的Nonce
[Day03]tinyML開發板介紹
永豐金融API測試員
[Day01]在享受tinyML這道美食之前
[Day3]使用ta-lib製作指標
[Day4]函數打包與買進持有報酬率試算
計算API所需要的參數:HashID
計算API所需要的參數:IV
前往鐵人賽
熱門問題
中華電信企業資安攻擊名稱HTTP-APACHE-LOG4j2-BODY6-RCE
40人小公司用的郵件伺服器
急救!將ImageView傳到另一個頁面
關於團隊合作
正航ERP相關問題
資安宣導文案
請問有哪位好心人能借一下百度帳號...
請教SQL大師,如何在GROUPBY分群裡找出組別最多筆數量的組別名稱
[已解決]急!!!csv匯入MySQLWorkbench出現錯誤訊息請問如何解決
C#如何將資料庫的每個字元從原本的(ascii編碼)逐一轉成(utf8編碼)
IT邦幫忙
站方公告
【2021iThome鐵人賽】登登登!究竟獎落誰家,2021iThome鐵人賽得獎名單正式揭曉
熱門tag
看更多
13th鐵人賽
12th鐵人賽
11th鐵人賽
鐵人賽
2019鐵人賽
2018鐵人賽
javascript
2017鐵人賽
windows
php
python
windowsserver
linux
c#
程式設計
資訊安全
css
vue.js
sql
分享
熱門回答
40人小公司用的郵件伺服器
關於團隊合作
資安宣導文案
SVN版本控制的選擇
python檔案計算問題
[已解決]急!!!csv匯入MySQLWorkbench出現錯誤訊息請問如何解決
C#如何將資料庫的每個字元從原本的(ascii編碼)逐一轉成(utf8編碼)
正航ERP相關問題
為什麼Visualstudio查詢資料庫資料會顯示
中華電信企業資安攻擊名稱HTTP-APACHE-LOG4j2-BODY6-RCE
熱門文章
【Day31】新加坡工作後續的時程
2021法遵科技與電腦稽核專題競賽-賀雲科大、逢甲、北商大、中正、致理科大、亞洲科大等學校隊伍獲獎,培育智慧法遵與AI稽核人才邁向國際~
Laravel-jQueryAJAX範例
[Day33]HexoxNexT-顯示最新文章、導入GoogleAnalytics的坑
【徵才】台北中山區-知名航空貨運-資訊網管人員
重構原本的內容(golang)(Day22)
科學家與研究生的關係研究篇
[Day??]2021iThome鐵人賽-頒獎典禮@2022.01.08‧輔仁大學
30天Python自學:Day01
印表機維修五種常見故障,若遇到問題就能先自己排除了
一週點數排行
更多點數排行
海綿寶寶(antijava)
Gary(mosbbs)
raytracy(raytracy)
一級屠豬士(hitomitanaka)
Samuel(kuanyu)
ccenjor(ccenjor)
居然解出來了(partyyaya)
horace_work(horace_work)
純真的人(jer5173)
souda(souda)
×
At
輸入對方的帳號或暱稱
Loading
找不到結果。
標記
{{result.label}}
{{result.account}}
關閉
延伸文章資訊
- 1kruskal演算法和Prim演算法 - 程序員學院
kruskal演算法和Prim演算法,設r為g的所有生成樹的集合,若t為r中邊的權值之和最小的那顆生成樹,則t稱為g的最小生成樹minimum spanning tree, m.
- 2圖形演算法-最小生成樹- 高中資訊科技概論教師黃建庭的教學網站
本節介紹Kruskal的最小生成樹演算法,因為這個演算法較容易實作,Kruskal演算法由最小的邊出發,找出最小不形成循環的邊,直到邊的個數為點的個數少1,就找到最小生成 ...
- 3資料結構與演算法——克魯斯卡爾(Kruskal)演算法 - IT人
克魯斯卡爾演算法圖解 · 第1 步:將邊 E,F [2] 加入R 中。 · 第2 步:將邊 C,D [3] 加入R 中。 · 第3 步:將邊 D,E [4] 加入R 中。 · 第4 步:將邊 B...
- 4Spanning Tree - 演算法筆記
權重最小的生成樹。可能有許多種。 Minimum Spanning Tree: Kruskal's Algorithm. 用途. 求出無向圖的 ...
- 5Day 23:最小生成樹(MST) - iT 邦幫忙
Kruskal演算法的方式是從所有邊中,反覆選擇最短的邊,它的步驟是: ... 如下圖,先將邊排序,依序選擇,其中邊be即是因為會形成環所以不選。