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個edgeGreedy 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
5
1
6
4
3
2 10
25
22 24
12 18
16 14
28
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))•
1 不然就沒有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不一樣, 0.證明題
•
每次我們從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 treePrim’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
5
1
6
4
3
2 10
25
22 24
12 18
16 14
28
細節們
•
必須maintain一個d陣列•
每個元素代表到目前為止, 從vertex i到已經在TV裡面的 vertex們最短的距離•
time complexity為•
使用adjacency matrix:•
使用adjacency lists + heap: log•
為什麼? 想想看囉. (沒有答案的動腦時間: 進階題)•
(想不出來的話可以來找我討論)Sollin’s algorithm
•
一開始每個vertex自己是一個forest•
保持都是forest•
每個stage, 每個forest都選擇一個該forest連到其他forest的 edge中cost最小的一個•
執行到沒有edge可以選了, 或者是變成tree了 05
1
6
4
3
2 10
25
22 24
12 18
16 14
28
Shortest paths
•
目標: 找出vertex u到graph G中任何一點的最短距離0
3
1
4
2
5 45
50 10
20 20 15
15 3
35 30 10
TO VERTEX PATH LENGTH
3 0 3 10
4 0 3 4 25
1 0 3 4 1 45
2 0 2 45
∞
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中例子
0
3
1
4
2
5
50 10
20 20 15
15 3
35 30 10
selection 0 1 2 3 4 5
Initial 50 45 10
3 50 45 10 25
4 45 60 10 25
1 45 55 10 25
2 45 55 10 25
更多動畫例子
• 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>.
• 綜合以上兩條規則:
• min , min ,
例子
0 2
3
6
5 6
5
5 ‐2
‐2
3
‐1 3
k 1 2 3 4 5 6
1 6 5 5 ∞ ∞ ∞
2 3 3 5 5 4 ∞
3 1 3 5 2 4 7
4 1 3 5 0 4 5
5 1 3 5 0 4 3
6 1 3 5 0 4 3
1
其他例子: http://www.ibiblio.org/links/applets/appindex/graphtheory.html
一些可以思考的東西
•
time complexity = ?•
答案:•
adjacency matrix:•
adjacency lists:•
前面都沒有提到怎麼真的輸出path本身經過哪些vertex•
想想看, 要怎麼做?•
自行閱讀: 課本6.4.3‐6.4.4答案: 每次 的時候, 順便
表示path
TANET
Routing protocol
•
要計算從某個點到另外一個點 的路徑(route)•
目標: 連線速度?•
path cost =?•
Dijkstra比較適合還是Bellman‐ford比較適合?
答案: 似乎 比較適合, 因為不需要知道所有
即可建立routing
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
2
0 4
6
7
8
3 5
start
finish 6
1
5
2
4 1
9
2
7 4 4
可以思考的一些問題
•
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
2
0 4
6
7
8
3 start
finish 6
1
5
2
4 1
9
2
7 4 4