• 沒有找到結果。

Michael Tsai 2011/11/25 GRAPH

N/A
N/A
Protected

Academic year: 2022

Share "Michael Tsai 2011/11/25 GRAPH"

Copied!
36
0
0

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

全文

(1)

GRAPH

Michael Tsai 2011/11/25

(2)

Biconnected Components相關名詞

Articulation point:

如果在connected graph G中的的一個vertex v被移除以後(包 含v和所有incident在它上面的edge), 新的graph G’會變成有 兩塊以上的connected components

(複習: 什麼是 connected components)

Biconnected graph: 沒有articulation point的graph

Biconnected component: maximal biconnected subgraph

這邊maximal是說, 沒有一個可以包含它的subgraph是 biconnected的

(3)

例子

1

2 3

0

4

5

7

6

8 9

猜一猜哪邊是articulation point? (有沒有articulation point?) 加了什麼邊可以讓它變成不是articulation point?

1 0

1

2 3

4

3 5

7

8 9

5

7

6 Biconnected components:

7

(4)

NTU CC 1G 光纖

cisco 3750

cisco 2960 cisco 2960

215 機房

各樓層研討室

Where is the articulation point(s)?

How do we eliminate them?

PC PC PC

實驗室

1G 網路線

(5)

DFS另一用途

可以用來尋找articulation point & biconnected components

怎麼用呢? 首先先把graph做一次dfs, 並標上discover的順序

從哪個vertex開始不重要, edge順序也不重要

(真的嗎? 自己驗證看看)

1

2 3

0

4

5

7

6

8 9

0

1 2

3 4

5

6 7

8 9

(6)

尋找articulation point

如果是root的話(開始做dfs 的地方), 且有超過一個的 children 是articulation point

如果不是root:

當有一個以上的小孩, 無 法沿著它自己的後代及一 條nontree edge (back edge) 到達它的祖先的時候, 則 為articulation point

back edge: 一條edge (u,v), u是v的祖先或者v是u的祖 先.

3

4

2

1

0

5

6

7

9 8

0

1

2

3

4

5

6

7

8 9

(7)

尋找articulation point

定義一些function來找articulation point

low(u)=min{u.d, min{low(w)|w is a child of u}, min{w.d| (u,w) is a back edge}}

(8)

尋找articulation point

當某vertex v有任何一個 child的low值>=v.d時, 則v 為articulation point

3

4

2

1

0

5

6

7

9 8

0

1

2

3

4

5

6

7

8 9

0 1 2 3 4 5 6 7 8 9

v.d 4 3 2 0 1 5 6 7 9 8

low 4 0 0 0 0 5 5 5 9 8

low(u)=min{u.d,

min{low(w)|w is a child of u}, min{w.d| (u,w) is a back edge}}

(9)

Minimum Cost Spanning Tree

電路設計需要把N個電子零件的接點連接在一起

這些接點在不同的位置

要如何把它們通通連接起來呢? 需要有N-1條”電線”, 每一條 把兩個接點連接起來

怎麼樣才能使用最短的電線呢?

轉換: G=(V,E) 是undirected graph, V是接點, E所有可能的電 線

每一個E (u,v)的weight w(u,v)代表所需使用的電線長度

須找出一個acyclic的subset 𝑇 ⊆ 𝐸 連接所有的vertex, 且使 𝑤 𝑇 = 𝑢,𝑣 ∈𝑇 𝑤(𝑢, 𝑣)

(10)

Minimum Cost Spanning Tree

T: acyclic且連接所有vertex, 所以為一棵tree且span到整個 graph, 所以稱為spanning tree.

複習: Spanning tree須滿足那些條件?

1. 因為是tree, 所以沒有cycle

2. 因為是tree, 所以正好有n-1個edge

下面介紹三種使用greedy algorithm產生minimum cost spanning tree的方法

(11)

一般型Minimum Spanning Tree演算法

GENERIC-MST(G,w)

while A does not form a spanning tree

find an edge (u,v) that is safe for A A=A ⋃* 𝑢, 𝑣 +

return A

A是最終的MST的edge的subset

隨時A都保持acyclic隨時𝐺

𝐴

= (𝑉, 𝐴) 都是一個forest

每次都選一個edge, 把 𝐺

𝐴

中兩棵tree連接起來 (因為不能出現cycle)

最後共選|V|-1條邊

下面三個algorithm的前兩個都是用這個方法

Reading Assignment: 課本23.1

(12)

Kruskal’s algorithm

這個方法是我覺得最直觀的方法.

MST-KRUSKAL(G,w) A={}

for each vertex 𝑣 ∈ 𝐺. 𝑉 MAKE-SET(v)

sort G.E by w

for each edge (u,v) ∈ 𝐺. 𝐸

if FIND-SET(u)≠FIND-SET(v) A=A⋃{(u,v)}

UNION(u,v) return A

0

5

1

6

4

3

2 10

25

22 24

12 18

16 14

28 管理set的一些工具function:

MAKE-SET(v): 創造一個set

FIND-SET(v): 找到這個set的頭頭(id) UNION(u,v): 把兩個set合併起來

(13)

Kruskal’s algorithm

MST-KRUSKAL(G,w) A={}

for each vertex 𝑣 ∈ 𝐺. 𝑉 MAKE-SET(v)

sort G.E by w

for each edge (u,v) ∈ 𝐺. 𝐸

if FIND-SET(u)≠FIND-SET(v) A=A⋃{(u,v)}

UNION(u,v) return A

𝑂(𝐸 log 𝐸)

𝑂(𝐸)次

𝑂(𝐸)次 𝑉 次

𝑂( 𝑉 + 𝐸 𝛼(𝑉)) 𝐸 ≥ 𝑉 − 1 since G is connected 𝑂(𝐸𝛼 𝑉 ) 𝛼 𝑉 = 𝑂 log 𝑉 = 𝑂(log 𝐸)

𝑂 𝐸 log 𝑉 𝐸 < 𝑉 2, 所以 log 𝐸 = 𝑂(log 𝑉 )

管理set的一些工具function:

MAKE-SET(v), FIND-SET(v), & UNION(u,v) 執行共m個operation的時候(n個item) 則執行時間為𝑂 𝑚𝛼 𝑛

管理set的資料結構相關內容請見課本21章

(14)

證明題

證明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了, 且正好每個edge都處理完畢 (成功, 不管它)

(2) T裡面還沒有n-1個edge, 但是每個edge都處理完畢, 而有些node沒有連接 到 (我們的algorithm會不會造成這樣的情形呢?)

但是我們的程式只會把造成cycle的edge丟掉, 當把造成cycle的edge丟掉的 時候, 不會因此讓某個node在T裡面沒有跟其他vertex connected.

所以不會造成(2)的情形

(15)

證明題

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

(16)

證明題

每次我們從T取出k條不一樣的edge中其中一條(此edge不在U中), 從cost最小的開始到cost最大的.

把這條edge(我們叫它t)加入U的時候, 會產生一個cycle在U中

這個cycle裡面, 一定有某一條edge不在T裡面, 我們叫它u (因為T 沒有cycle). 我們把u從U拿掉, 這個新的spanning tree叫做V

V的total cost就是 cost(U)-cost(u)+cost(t).

T U

k條不在U中的, 其中最小的為t

t u

V

(17)

證明題

但是cost(t)不能小於cost(u), 否則V就比U的cost少了 (contradiction)

cost(t)也不能大於cost(u),

不然當初我們做T的時候, 應該會先選到u, 但是因為它會造 成cycle所以才不選它.

所以u和所有在T裡面cost跟cost(u)一樣大或者更小的edge會 造成cycle.

但是剛剛既然我們先選到t (在T裡面不在U裡面最小的一個), 表示這些cost跟cost(u)一樣大或者更小的edge都在U裡面

表示u和這些edge都在U裡面, U會有cycle (contradiction)

(18)

證明題

搞了半天, 目前可以證明cost(f)=cost(e)

所以cost(V)=cost(U)

重複以上步驟, 可以最後變成 V=T 且 cost(V)=cost(T)=cost(U)

所以T也是minimum cost spanning tree

(19)

Prim’s Algorithm

MST-PRIM(G,w,r) for each 𝑢 ∈ 𝐺. 𝑉

u.key=∞

u.pi=NIL r.key=0

Q=G.V

while Q≠{}

u=EXTRACT-MIN(Q)

for each 𝑣 ∈G.Adj[u]

if v∈ 𝑄 and w(u,v)<v.key v.pi=u

v.key=w(u,v) A={(v,v.pi):v∈V-{r}}

0

5

1

6

4

3

2 10

25

22 24

12 18

16 14

28 u.key: 記錄到𝐺𝐴最短的邊的weight

u.pi: 紀錄上面講的那條邊的另外一端是哪個vertex

(20)

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

(21)

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

5 No path ∞

(22)

Dijkstra’s algorithm

Set S裡面有一些已經加入的vertex (包括起始點𝑣0)

w不在S中, 則有distance[w]紀錄從𝑣0經過S中的任意個vertex 後, 最後到達w的這樣形式的最短路徑

w S 𝑣0

(23)

Dijkstra’s algorithm

每次選擇u, 為distance[u]中最小的

選進S以後, 𝑣0到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>)

(24)

小證明

如果下一個選擇的vertex為u, 為什麼𝑣0到u的最短path會正 好是前面的vertex都在S中, 只有u不在S中呢?

因為假如有path中有vertex w也不在S中, 那麼表示path中會 有一段是𝑣0到w, 而且長度比較短 (因為是sub path)

可是這樣的話, 應該w之前應該就要被選過了 (應該要在S中) (contradiction)

所以𝑣0到u的最短path前面的vertex都在S中, 只有u不在S中

(25)

例子

0

3

1

4

2

5 45

50 10

20 20 15

15 3

35 30 10

selection 0 1 2 3 4 5

Initial 0 50 45 10 ∞ ∞

(26)

例子

0

3

1

4

2

5

50 10

20 20 15

15 3

35 30 10

selection 0 1 2 3 4 5

Initial 0 50 45 10 ∞ ∞

3 0 50 45 10 25 ∞

4 0 45 45 10 25 ∞

1 0 45 45 10 25 ∞

2 0 45 45 10 25 ∞

(27)

更多動畫例子

http://www-b2.is.tokushima-

u.ac.jp/~ikeda/suuri/dijkstra/DijkstraApp.shtml?demo1

Time complexity?

答案: 𝑂(|𝑉|2)

每次都要看一次distance[], 共n個

(28)

Bellman-Ford algorithm

另外一種找到shortest path的algorithm

可以handle path cost是負的情形

為什麼Dijkastra 有問題?

如果下一個選擇的vertex為u, 為什麼𝑣0到u的最短path會正 好是前面的vertex都在S中, 只有u不在S中呢?

因為假如有path中有vertex w也不在S中, 那麼表示path中會 有一段是𝑣0到w, 而且長度比較短 (因為是sub path)

可是這樣的話, 應該w之前應該就要被選過了 (應該要在S中) (contradiction)

所以𝑣0到u的最短path前面的vertex都在S中, 只有u不在S中

假設cost可以是負的, 這就不一定 正確了.

(29)

Bellman-Ford algorithm

定義 𝑑𝑖𝑠𝑡𝑙 𝑢 為從𝑣0到u的最短路徑, 最多經過l條edge

一開始𝑑𝑖𝑠𝑡1 𝑢 為cost(<𝑣0,u>) (如果沒有edge則為無限大)

由𝑑𝑖𝑠𝑡𝑘−1,-算𝑑𝑖𝑠𝑡𝑘,-

最後算到𝑑𝑖𝑠𝑡𝑛−1 𝑢 為最後shortest path解 (因為每個node最 多走一遍, 不然就有cycle了)

(30)

Bellman-Ford algorithm

由𝑑𝑖𝑠𝑡𝑘−1,-算𝑑𝑖𝑠𝑡𝑘,-

怎麼算呢?

有以下兩種可能性:

如果從𝑣0到u的使用最多k個edge的最短路徑其實使用了k-1 或更少edge的話, 則𝑑𝑖𝑠𝑡𝑘 𝑢 = 𝑑𝑖𝑠𝑡𝑘−1 𝑢

如果從𝑣0到u的使用最多k個edge的最短路徑使用了k條edge 的話, 則最短路徑可能為經過別的vertex i的shortest path (用 了最多k-1條edges)後再走edge <i,u>.

綜合以上兩條規則:

𝑑𝑖𝑠𝑡𝑘 𝑢 = min⁡*𝑑𝑖𝑠𝑡𝑘−1 𝑢 , min

𝑖 𝑑𝑖𝑠𝑡𝑘−1 𝑖 + 𝑐𝑜𝑠𝑡 𝑖, 𝑢 +

(31)

例子

0

1

2

3

4

6

5 6

5

5 -2

-2

-1

3

-1 3

k 1 2 3 4 5 6

1 6 5 5 ∞ ∞ ∞

2 3 4 5 6

1

其他例子: http://www.ibiblio.org/links/applets/appindex/graphtheory.html vertex 0到其他vertices的最短路徑:

(32)

例子

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

(33)

一些可以思考的東西

time complexity = ?

答案:

adjacency matrix: 𝑂(|𝑉|3)

adjacency lists: 𝑂 𝑉 |𝐸|

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

想想看, 要怎麼做?

答案: 每次 up

dat e d ist an 的時候, 順便 ce

up dat e附在旁邊的 lin

ked list . (用 lin ked list 表示pa

th )

(34)

TANET

(35)

Routing protocol

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

目標: 連線速度?

path cost =?

Dijkstra比較適合還是Bellman- ford比較適合?

答案: 似乎 Be

llm an -Fo 比較適合, 因為不需要知道所有 rd

lin k c 即可建立ro ost

uti ng ta ble

(36)

周末愉快

參考文獻

相關文件

概念:  Hash  Table.

神秘的資料結構

• External Sort: 資料太大了, 有些要放到別的地方 (硬碟, 記憶 卡, 網路上的其他電腦上, 等等等).. •

• vertex

之後每次從 heap 取 出一個 item, 放入 sorted list.. array of items 想是

計算機網路 微積分上 微積分下

• 以下我們將說明為什麼 average running time 會接近 bes t-case. • 假設很糟的一個狀況 :

[r]