• 沒有找到結果。

Michael Tsai

N/A
N/A
Protected

Academic year: 2022

Share "Michael Tsai"

Copied!
36
0
0

加載中.... (立即查看全文)

全文

(1)

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

5

1

6

4

3

2 10

25

22 24

12 18

16 14

28

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

1 不然就沒有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不一樣,  0.

(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

5

1

6

4

3

2 10

25

22 24

12 18

16 14

28

(17)

細節們

必須maintain一個d陣列

每個元素代表到目前為止, 從vertex i到已經在TV裡面的 vertex們最短的距離

time complexity為

使用adjacency matrix: 

使用adjacency lists + heap:  log

為什麼? 想想看囉. (沒有答案的動腦時間: 進階題)

(想不出來的話可以來找我討論)

(18)

Sollin’s algorithm

一開始每個vertex自己是一個forest

保持都是forest

每個stage, 每個forest都選擇一個該forest連到其他forest的 edge中cost最小的一個

執行到沒有edge可以選了, 或者是變成tree了 0

5

1

6

4

3

2 10

25

22 24

12 18

16 14

28

(19)

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

(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)

例子

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

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

綜合以上兩條規則:

min , min ,

(28)

例子

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

(29)

一些可以思考的東西

time complexity = ?

答案:

adjacency matrix: 

adjacency lists: 

前面都沒有提到怎麼真的輸出path本身經過哪些vertex

想想看, 要怎麼做?

自行閱讀: 課本6.4.3‐6.4.4

答案: 每次 的時候, 順便

表示path

(30)

TANET

(31)

Routing protocol

要計算從某個點到另外一個點 的路徑(route)

目標: 連線速度?

path cost =?

Dijkstra比較適合還是Bellman‐

ford比較適合?

答案: 似乎 比較適合, 因為不需要知道所有

即可建立routing

(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

2

0 4

6

7

8

3 5

start

finish 6

1

5

2

4 1

9

2

7 4 4

(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

2

0 4

6

7

8

3 start

finish 6

1

5

2

4 1

9

2

7 4 4

(36)

周末愉快

怎麼算這些東西呢? 下回分解.

作業早點開始寫, 早點可以問問題

ptt2開板中(HsinMu), 當作問問題的另一管道 (或聊天打屁也 行)

分數問題, 請洽助教

參考文獻

相關文件

是以法國物理學家 Augustin Fresnel 命名的。.

同一個常數 C ,只適用在 ( 0) 或者 (0, ) 上。.

萊布尼茲將加總 sum 的符號的 S 拉長成積分符號,而小段 區間的寬度 x 使用 dx

超定方程组QR分解算法 数据拟合确定常微分方程..

酸鹼滴定、一次微分、二次微分曲線圖..

4.6 Indeterminate Forms and L’Hôpital’s Rule 4.7 The Natural Logarithmic Function: Integration 4.8 Inverse Trigonometric Functions: Integration.. Hung-Yuan Fan

6.1 Integration by Parts 6.2 Trigonometric Integrals 6.3 Trigonometric Substitution 6.4 Partial Fractions.. 6.7

微算機基本原理與應用 第15章