320 likes | 469 Views
最小生成樹. 最小生成樹. 生成子圖形 包含所有 G 之頂點的圖形 G 之子圖 生成樹 本身是一棵 ( 自由 ) 樹的生成子圖 最小生成樹 (MST) 權重圖中擁有最小總邊權重的生成樹 應用 通訊網路 運輸網路. 循環性質. 循環性質: 令 T 為權重圖 G 的最小生成樹 令 e 為 G 的邊,但不屬於 T ;令 C 為 e 與 T 所構成的循環 對於 C 所有的邊 f 而言, weight ( f ) ≤ weight ( e ) 證明 : 透過反證法
E N D
最小生成樹 最小生成樹
最小生成樹 生成子圖形 • 包含所有G 之頂點的圖形G 之子圖 生成樹 • 本身是一棵 (自由) 樹的生成子圖 最小生成樹 (MST) • 權重圖中擁有最小總邊權重的生成樹 • 應用 • 通訊網路 • 運輸網路 最小生成樹
循環性質 循環性質: • 令T 為權重圖G 的最小生成樹 • 令e 為G 的邊,但不屬於T;令C 為e 與T 所構成的循環 • 對於C 所有的邊f 而言,weight(f) ≤ weight(e) 證明: • 透過反證法 • 如果 weight(f) > weight(e),我們便可以將f 取代為e ,以得到權重更小的生成樹 最小生成樹
分割性質 • 分割性質: • 考量某個將G 的頂點切分為子集合U 與V 的分割 • 令e 為跨越此分割的最小權重邊 • G 有一最小生成樹包含邊e 證明: • 令T 為G 的MST • 如果T 不包含e,考量由e 與T 所構成的循環C ,令f 為C 跨越分割的邊 • 根據循環性質, weight(f) ≤ weight(e) • 因此,weight(f) = weight(e) • 我們可藉由將f 替換成e,以取得另一棵MST 取代 e 中的f 到另一個MST 最小生成樹
Kruskal 演算法 • 使用一份優先權佇列儲存頂點群以外的邊 • 鍵值:權重 • 元素:邊 • 演算法結束時 • 我們得到一份包含了 MST 的頂點群 • 得到為我們的 MST 的樹 T 最小生成樹
Kruskal 演算法的資料結構 • 此演算法會維護一份樹的森林 • 如果某個邊連通了不同的樹,便會被接受 • 我們需要一份維護分割的資料結構,意即無重複子集合的群集,包含以下操作: - find(u):回傳包含 u 的集合 - union(u、v) :使用聯集取代包含 u 與 v 的集合 最小生成樹
分割的表示法 • 每個集合都儲存在序列中 • 每個元素都包含一份指回集合本身的參照 • 操作 find(u) 所花費的時間為 O(1),會回傳 u 為其成員的集合 • 在操作 union(u,v) 中,我們會將較小集合的元素搬移到較大集合的序列中,並更新其參照 • 操作 union(u,v) 的執行時間為 min(nu,nv),其中nu與 nv是存有 u 與 v 的集合大小 • 無論何時,元素在被處理時一定會進入到大小至少為雙倍的集合中,因此每個元素最多會被處理 log n 次 最小生成樹
使用分割建立的實作 • 使用分割建立的 Kruskal 演算法版本,會使用聯集來執行頂點群的合併,使用尋找來執行測試 最小生成樹
Kruskal 的例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
例子 最小生成樹
Prim-Jarnik 演算法 • 類似 Dijkstra 演算法 (針對連通圖) • 我們挑選任意頂點s,然後從s 開始,以頂點群的方式增長MST • 我們在每個頂點v 上頭儲存一份標籤d(v) = 將v 連通至頂點群中另一頂點的邊的最小權重 • 在每一步中: • 我們將位於頂點群外,擁有最小距離標籤的頂點u,加入到頂點群中 • 我們更新與u相鄰之頂點的標籤 最小生成樹
Prim-Jarnik 演算法 (續) • 使用一份優先權佇列儲存頂點群以外的頂點 • 鍵值:距離 • 元素:頂點 • 使用定位器建立的方法 • insert (k,e) 回傳一份定位器 • replaceKey (l,k) 改變項目的鍵值 • 我們在每個頂點上都儲存三份標籤: • 距離 • 在MST中的父邊 • 在優先權佇列中的定位器 最小生成樹
例子 最小生成樹
例子 (續) 最小生成樹
分析 • 圖形操作 • 方法 incidentEdges 會針對每個頂點被呼叫一次 • 標籤操作 • 我們會設定/取得頂點z的距離、父邊與定位器標籤共O(deg(z)) 次 • 設定/取得一個標籤所花費的時間為O(1) • 優先權佇列操作 • 每個頂點會插入並移除一次到優先權佇列中,其中每次插入與移除所花費的時間為O(log n) • 頂點w 位於優先權佇列中的鍵值最多會被修改 deg(w) 次,其中每次改變鍵值所花費的時間為O(log n) • Prim-Jarnik 演算法會在O((n + m) log n) 時間內執行,如果圖形是以鄰接串列結構來表示的話 • 回想一下 Σvdeg(v) = 2m • 執行時間為 O(m log n),因為圖形為連通圖 最小生成樹
Baruvka 演算法 • 類似 Kruskal 演算法,但 Baruvka 演算法會一次長出多份「頂點群」 • while-loop的每次循環都會將T的連通成員數量減半 • 執行時間為 O(m log n) 最小生成樹
Baruvka 的例子 最小生成樹
例子 最小生成樹
例子 最小生成樹