360 likes | 517 Views
Graph. Michael Tsai 2010/12/2. 今日 行程. 助教講解部分期中考題目評分標準 發考卷 一些需要討論的事項 Minimum spanning tree Shortest path Activity network. 補課事宜. 12/17 ( 五 ) 將不在國內 , 停課乙次 之後需要 補課 請班 代 ( 雅喬 ) 統計 12/20-23 的晚上哪一天各位比較喜歡 補課時間 6pm-9pm. 資料結構與演算法下. 續集將亦由在下任教 課本可以先訂 , 與單班目前課本同一本 預習 讚 . 概念溝通.
E N D
Graph Michael Tsai 2010/12/2
今日行程 • 助教講解部分期中考題目評分標準 • 發考卷 • 一些需要討論的事項 • Minimum spanning tree • Shortest path • Activity network
補課事宜 • 12/17 (五) 將不在國內, 停課乙次 • 之後需要補課 • 請班代(雅喬) 統計12/20-23的晚上哪一天各位比較喜歡 • 補課時間 6pm-9pm
資料結構與演算法下 • 續集將亦由在下任教 • 課本可以先訂, 與單班目前課本同一本 • 預習讚
概念溝通 • 之後的課程, 不可能每個部分都帶著大家一步一步看 • 那些東西呢: (以下的一部分) • 怎麼把概念轉化成code • time complexity的分析 • 證明 • 有些課本內容將不會教 (練習自己看, 會在課堂上提到哪邊比較重要) • 有問題隨時都可以來找我討論 (雖然我不一定會, 當場不一定想得出來)
Minimum cost spanning tree • 一個graph可能有多個spanning tree • 假設每個edge上面都有cost • 哪一個spanning tree的總花費(所有edge cost總和)最小呢? • 複習: spanning tree須滿足那些條件? • 1. 因為是tree, 所以沒有cycle • 2. 因為是tree, 所以正好有n-1個edge
Greedy algorithm • 什麼是貪婪的演算法(Greedy algorithm)呢? • “根據目前所了解的狀況挑出一個最好的選擇” • “要挑就要挑最好的” • 不一定最後會有最佳解 (但是許多狀況下是, 這時候這就是一個好的策略) • 下學期會介紹更多的greedy algorithm • 今天要介紹三種利用greedy algorithm解minimum spanning tree的方法
Kruskal’s algorithm • 這個方法是我覺得最直觀的方法. • T={}; //在spanning tree裡面的edge • while(T中有少於n-1個edge && E不是空的) { • 選出E中cost最小的edge, 從E中拿掉. • 如果加入T不會造成cycle則加入T, 不然就丟掉. • } 0 28 10 1 14 5 16 6 25 24 2 18 4 12 22 3 N-1條邊了- 停止
細節們 T={}; //在spanning tree裡面的edge while(T中有少於n-1個edge && E不是空的) { 選出E中cost最小的edge, 從E中拿掉. 如果加入T不會造成cycle則加入T, 不然就丟掉. } • 主要的工作們: • (1)選出E中最小的edge • (2)檢查加入T會不會造成cycle • 怎麼做?分別要花多少時間呢?
細節們 • (1) 用minimum heap. 這樣選出一個最小cost的edge要花O(log e) • 還有一開始做一個heap出來(加入所有edge)要花O(e log e) • (2)用之前的set union+find的algorithm • 當要把edge (i,j)加入前, 看find(i)是否==find(j) 屬於同一個set • 同一個set意思就是說已經連在一起了, 再加會有cycle • find = O(log e) • 如果要加進去, 再用union • union = O(log e) • 如果丟掉, 當然也是O(1) • O( e log e + (n-1)(log e + log e)) • 不然就沒有spanning tree了 • 所以最後可以化為 O(e log e)
證明題 • 證明Kruskal’s algorithm會產生出minimum cost spanning tree. • (1) 證明當某graph有spanning tree的時候, Kruskal’s algorithm會產生出spanning tree. • (2) 證明這個產生出來的spanning tree一定是cost最小的. • 證明(1): • 什麼時候某graph一定有spanning tree呢? • 原本是connected的 • Algorithm什麼時候會停下來呢? • (1) 當T裡面已經有n-1個edge了 (成功, 不管它) • (2) T裡面還沒有n-1個edge, 但是E裡面已經沒有edge, 造成有些node沒有連接到 (我們的algorithm會不會造成這樣的情形呢?) • 但是我們的程式只會把造成cycle的edge丟掉, 當把造成cycle的edge丟掉的時候, 不會因此讓某個node在T裡面沒有跟其他vertex connected. • 所以不會造成(2)的情形
證明題 • 證明(2) • 假設T是用我們的algorithm做出來的spanning tree • 假設U是某一個minimum cost spanning tree (可能有很多個, 其中一個) • 既然都是spanning tree, T和U都有n-1個edge • 有兩種情形: • (1) T和U一模一樣, 則T就是minimum cost spanning tree (沒什麼好證的) • (2)T和U不一樣. 則我們假設它們有k條edge不一樣, .
證明題 • 每次我們從T取出k條不一樣的edge中其中一條(此edge不在U中), 從cost最小的開始到cost最大的. • 把這條edge(我們叫它e)加入U的時候, 會產生一個cycle在U中 • 這個cycle裡面, 一定有某一條edge不在T裡面, 我們叫它f(因為T沒有cycle). 我們把f從U拿掉, 這個新的spanning tree叫做V • V的total cost就是 cost(U)-cost(f)+cost(e).
證明題 • 但是cost(e)不能小於cost(f), 否則V就比U的cost少了 (contradiction) • cost(f)也不能小於cost(e), • 不然當初我們做T的時候, 應該會先選到f, 但是因為它會造成cycle所以才不選它. • 所以f和所有在T裡面cost跟cost(f)一樣大或者更小的edge會造成cycle. • 但是剛剛既然我們先選到e (在T裡面不在U裡面最小的一個), 表示這些cost跟cost(f)一樣大或者更小的edge都在U裡面 • 表示f和這些edge都在U裡面, U會有cycle (contradition)
證明題 • 搞了半天, 目前可以證明cost(f)=cost(e) • 所以cost(V)=cost(U) • 重複以上步驟, 可以最後變成 V=T 且 cost(V)=cost(T)=cost(U) • 所以T也是minimum cost spanning tree
Prim’s Algorithm • T={} • TV={0} • while(T少於n-1條edge) { • 找出一條但中cost最小的edge (u,v) • 如果找不到就break; • add v to TV • add (u,v) to T • } • 如果T中少於n-1條edge, 就output失敗 0 28 10 1 14 5 16 6 25 24 2 18 4 12 22 3
細節們 • 必須maintain一個d陣列 • 每個元素代表到目前為止, 從vertex i到已經在TV裡面的vertex們最短的距離 • time complexity為 • 使用adjacency matrix: • 使用adjacency lists + heap: • 為什麼? 想想看囉. (沒有答案的動腦時間: 進階題) • (想不出來的話可以來找我討論)
Sollin’s algorithm • 一開始每個vertex自己是一個forest • 保持都是forest • 每個stage, 每個forest都選擇一個該forest連到其他forest的edge中cost最小的一個 • 執行到沒有edge可以選了, 或者是變成tree了 0 28 10 1 14 5 16 6 25 24 2 18 4 12 22 3
Shortest paths • 目標: 找出vertex u到graph G中任何一點的最短距離 45 50 10 0 1 2 15 35 10 20 20 30 15 4 3 5 3
Dijkstra’s algorithm • Set S裡面有一些已經加入的vertex (包括起始點) • w不在S中, 則有distance[w]紀錄從經過S中的任意個vertex後, 最後到達w的這樣形式的最短路徑 w S
Dijkstra’s algorithm • 每次選擇u, 為distance[u]中最小的 • 選進S以後, 到u的shortest path就找到了 • 所以找到shortest path的順序會是由最短的找到最長的 • 把u選進去S以後, 就要把所有u的edge <u,w>都看一遍: • if distance[w]>distance[u]+cost(<u,w>) • distance[w]=distance[u]+cost(<u,w>)
小證明 • 如果下一個選擇的vertex為u, 為什麼到u的最短path會正好是前面的vertex都在S中, 只有u不在S中呢? • 因為假如有path中有vertex w也不在S中, 那麼表示path中會有一段是到w, 而且長度比較短 (因為是sub path) • 可是這樣的話, 應該w之前應該就要被選過了 (應該要在S中) (contradiction) • 所以到u的最短path前面的vertex都在S中, 只有u不在S中
例子 45 50 10 0 1 2 15 35 10 20 20 30 15 4 3 5 3
更多動畫例子 • http://www-b2.is.tokushima-u.ac.jp/~ikeda/suuri/dijkstra/DijkstraApp.shtml?demo1 • Time complexity? • 答案: • 每次都要看一次distance[], 共n個
Bellman-Ford algorithm • 另外一種找到shortest path的algorithm • 可以handle path cost是負的情形 • 為什麼Dijkastra有問題? • 如果下一個選擇的vertex為u, 為什麼到u的最短path會正好是前面的vertex都在S中, 只有u不在S中呢? • 因為假如有path中有vertex w也不在S中, 那麼表示path中會有一段是到w, 而且長度比較短 (因為是sub path) • 可是這樣的話, 應該w之前應該就要被選過了 (應該要在S中) (contradiction) • 所以到u的最短path前面的vertex都在S中, 只有u不在S中 假設cost可以是負的, 這就不一定正確了.
Bellman-Ford algorithm • 定義 為從到u的最短路徑, 最多經過l條edge • 一開始為cost(<,u>) (如果沒有edge則為無限大) • 由算 • 最後算到為最後shortest path解 (因為每個node最多走一遍, 不然就有cycle了)
Bellman-Ford algorithm • 由算 • 怎麼算呢? • 有以下兩種可能性: • 如果從到u的使用最多k個edge的最短路徑其實使用了k-1或更少edge的話, 則 • 如果從到u的使用最多k個edge的最短路徑使用了k條edge的話, 則最短路徑可能為經過別的vertex i的shortest path (用了最多k-1條edges)後再走edge <i,u>. • 綜合以上兩條規則:
例子 -1 1 4 3 6 -2 1 5 0 2 6 -2 3 5 -1 3 5 其他例子: http://www.ibiblio.org/links/applets/appindex/graphtheory.html
一些可以思考的東西 • time complexity = ? • 答案: • adjacency matrix: • adjacency lists: • 前面都沒有提到怎麼真的輸出path本身經過哪些vertex • 想想看, 要怎麼做? • 自行閱讀: 課本6.4.3-6.4.4 答案: 每次update distance的時候, 順便update附在旁邊的linked list. (用linked list表示path)
Routing protocol • 要計算從某個點到另外一個點的路徑(route) • 目標: 連線速度? • path cost =? • Dijkstra比較適合還是Bellman-ford比較適合? 答案: 似乎Bellman-Ford比較適合, 因為不需要知道所有link cost即可建立routing table
Activity-on-vertex (AOV) Network 微積分上 微積分下 機率 • 什麼時候可以修j課程呢? 修完所有edge<i,j>中i課程以後 • 所有的”activity”都是發生在vertex上 • 所以稱為activity-on-vertex (AOV) network • 問: 如何找到一種修課順序呢? • 此順序又稱為topological order 計算機網路 計概 計組 作業系統 計程 演算法上 演算法下
Topological sorting • for (i=0;i<n;++i) { • if (每個現存的vertex都還有祖先) • return error; • 選一個沒有祖先的vertex v • output v • 把v還有所有有連到它的edge們都刪掉 • } • 試試看? • 想想看怎麼寫程式? (答案可以看課本p.319) • time complexity: O(e+n)
Activity-on-edge (AOE) Network • 不是Ages of Empires (爛梗) • “Activities”發生在edge上 • edge cost=所需要完成activity的時間 • 例如: vertex 4可以解釋為完成及後的時間 1 start 6 finish 8 0 4 2 7 3 5
可以思考的一些問題 • vertex 8=完成所有工作. 完成的時間為? • 完成的時間為從start finish的最長path. • 又稱為critical path • 想想看為什麼? • earliest time(edge e): 為該activity最早可以開始的時間 • latest time(edge e):不延誤最後完成時間的前提下activity可以開始的最晚時間 • earliest time(e) == latest time(e) • then e為critical activity • (完全不能延誤) 1 start 6 finish 8 0 4 2 7 3 5
周末愉快 • 怎麼算這些東西呢? 下回分解. • 作業早點開始寫, 早點可以問問題 • ptt2開板中(HsinMu), 當作問問題的另一管道 (或聊天打屁也行) • 分數問題, 請洽助教