1 / 36

Graph

Graph. Michael Tsai 2010/12/2. 今日 行程. 助教講解部分期中考題目評分標準 發考卷 一些需要討論的事項 Minimum spanning tree Shortest path Activity network. 補課事宜. 12/17 ( 五 ) 將不在國內 , 停課乙次 之後需要 補課 請班 代 ( 雅喬 ) 統計 12/20-23 的晚上哪一天各位比較喜歡 補課時間 6pm-9pm. 資料結構與演算法下. 續集將亦由在下任教 課本可以先訂 , 與單班目前課本同一本 預習 讚 . 概念溝通.

spence
Download Presentation

Graph

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Graph Michael Tsai 2010/12/2

  2. 今日行程 • 助教講解部分期中考題目評分標準 • 發考卷 • 一些需要討論的事項 • Minimum spanning tree • Shortest path • Activity network

  3. 補課事宜 • 12/17 (五) 將不在國內, 停課乙次 • 之後需要補課 • 請班代(雅喬) 統計12/20-23的晚上哪一天各位比較喜歡 • 補課時間 6pm-9pm

  4. 資料結構與演算法下 • 續集將亦由在下任教 • 課本可以先訂, 與單班目前課本同一本 • 預習讚

  5. 概念溝通 • 之後的課程, 不可能每個部分都帶著大家一步一步看 • 那些東西呢: (以下的一部分) • 怎麼把概念轉化成code • time complexity的分析 • 證明 • 有些課本內容將不會教 (練習自己看, 會在課堂上提到哪邊比較重要) • 有問題隨時都可以來找我討論 (雖然我不一定會, 當場不一定想得出來)

  6. Minimum cost spanning tree • 一個graph可能有多個spanning tree • 假設每個edge上面都有cost • 哪一個spanning tree的總花費(所有edge cost總和)最小呢? • 複習: spanning tree須滿足那些條件? • 1. 因為是tree, 所以沒有cycle • 2. 因為是tree, 所以正好有n-1個edge

  7. Greedy algorithm • 什麼是貪婪的演算法(Greedy algorithm)呢? • “根據目前所了解的狀況挑出一個最好的選擇” • “要挑就要挑最好的” • 不一定最後會有最佳解 (但是許多狀況下是, 這時候這就是一個好的策略) • 下學期會介紹更多的greedy algorithm • 今天要介紹三種利用greedy algorithm解minimum spanning tree的方法

  8. 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條邊了- 停止

  9. 細節們 T={}; //在spanning tree裡面的edge while(T中有少於n-1個edge && E不是空的) { 選出E中cost最小的edge, 從E中拿掉. 如果加入T不會造成cycle則加入T, 不然就丟掉. } • 主要的工作們: • (1)選出E中最小的edge • (2)檢查加入T會不會造成cycle • 怎麼做?分別要花多少時間呢?

  10. 細節們 • (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)

  11. 證明題 • 證明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)的情形

  12. 證明題 • 證明(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不一樣, .

  13. 證明題 • 每次我們從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).

  14. 證明題 • 但是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)

  15. 證明題 • 搞了半天, 目前可以證明cost(f)=cost(e) • 所以cost(V)=cost(U) • 重複以上步驟, 可以最後變成 V=T 且 cost(V)=cost(T)=cost(U) • 所以T也是minimum cost spanning tree

  16. 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

  17. 細節們 • 必須maintain一個d陣列 • 每個元素代表到目前為止, 從vertex i到已經在TV裡面的vertex們最短的距離 • time complexity為 • 使用adjacency matrix: • 使用adjacency lists + heap: • 為什麼? 想想看囉. (沒有答案的動腦時間: 進階題) • (想不出來的話可以來找我討論)

  18. 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

  19. Shortest paths • 目標: 找出vertex u到graph G中任何一點的最短距離 45 50 10 0 1 2 15 35 10 20 20 30 15 4 3 5 3

  20. Dijkstra’s algorithm • Set S裡面有一些已經加入的vertex (包括起始點) • w不在S中, 則有distance[w]紀錄從經過S中的任意個vertex後, 最後到達w的這樣形式的最短路徑 w S

  21. 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>)

  22. 小證明 • 如果下一個選擇的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中

  23. 例子 45 50 10 0 1 2 15 35 10 20 20 30 15 4 3 5 3

  24. 更多動畫例子 • http://www-b2.is.tokushima-u.ac.jp/~ikeda/suuri/dijkstra/DijkstraApp.shtml?demo1 • Time complexity? • 答案: • 每次都要看一次distance[], 共n個

  25. 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可以是負的, 這就不一定正確了.

  26. Bellman-Ford algorithm • 定義 為從到u的最短路徑, 最多經過l條edge • 一開始為cost(<,u>) (如果沒有edge則為無限大) • 由算 • 最後算到為最後shortest path解 (因為每個node最多走一遍, 不然就有cycle了)

  27. Bellman-Ford algorithm • 由算 • 怎麼算呢? • 有以下兩種可能性: • 如果從到u的使用最多k個edge的最短路徑其實使用了k-1或更少edge的話, 則 • 如果從到u的使用最多k個edge的最短路徑使用了k條edge的話, 則最短路徑可能為經過別的vertex i的shortest path (用了最多k-1條edges)後再走edge <i,u>. • 綜合以上兩條規則:

  28. 例子 -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

  29. 一些可以思考的東西 • time complexity = ? • 答案: • adjacency matrix: • adjacency lists: • 前面都沒有提到怎麼真的輸出path本身經過哪些vertex • 想想看, 要怎麼做? • 自行閱讀: 課本6.4.3-6.4.4 答案: 每次update distance的時候, 順便update附在旁邊的linked list. (用linked list表示path)

  30. TANET

  31. Routing protocol • 要計算從某個點到另外一個點的路徑(route) • 目標: 連線速度? • path cost =? • Dijkstra比較適合還是Bellman-ford比較適合? 答案: 似乎Bellman-Ford比較適合, 因為不需要知道所有link cost即可建立routing table

  32. Activity-on-vertex (AOV) Network 微積分上 微積分下 機率 • 什麼時候可以修j課程呢? 修完所有edge<i,j>中i課程以後 • 所有的”activity”都是發生在vertex上 • 所以稱為activity-on-vertex (AOV) network • 問: 如何找到一種修課順序呢? • 此順序又稱為topological order 計算機網路 計概 計組 作業系統 計程 演算法上 演算法下

  33. 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)

  34. 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

  35. 可以思考的一些問題 • 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

  36. 周末愉快 • 怎麼算這些東西呢? 下回分解. • 作業早點開始寫, 早點可以問問題 • ptt2開板中(HsinMu), 當作問問題的另一管道 (或聊天打屁也行) • 分數問題, 請洽助教

More Related