第七章 圖形結構
DESCRIPTION
第七章 圖形結構. 7-1 圖形的起源 7-2 圖形介紹 7-3 圖形表示法 7-4 圖形的追蹤. 7-5 擴張樹 7-6 MST 擴張樹 7-7 圖形最短路徑 7-8 AOV 網路與拓樸排序. 圖形的起源. 下圖為「肯尼茲堡橋樑」問題的簡圖,尤拉所思考的問題是這樣的,「如何在只經過每一座橋樑一次的情況下,把所有地方走過一次而且回到原點。」. 尤拉環與尤拉鏈. 尤拉環 「當所有頂點的分支度皆為偶數時,才能從某頂點出發,經過每一邊一次,再回到起點。」 - PowerPoint PPT PresentationTRANSCRIPT
1
第七章 圖形結構
7-1 圖形的起源
7-2 圖形介紹
7-3 圖形表示法
7-4 圖形的追蹤
7-5 擴張樹
7-6 MST 擴張樹
7-7 圖形最短路徑
7-8 AOV 網路與拓樸排序
2
圖形的起源
下圖為「肯尼茲堡橋樑」問題的簡圖,尤拉所思考的問題是這樣的,「如何在只經過每一座橋樑一次的情況下,把所有地方走過一次而且回到原點。」
3
尤拉環與尤拉鏈尤拉環
「當所有頂點的分支度皆為偶數時,才能從某頂點出發,經過每一邊一次,再回到起點。」
在下圖中每個頂點的分支度都是奇數,所以尤拉所思考的問題是不可能發生的,這個理論就是有名的「尤拉環」 (Eulerian cycle) 理論。
尤拉環
4
尤拉鏈
如果條件改成從某頂點出發,經過每邊一次,不一定要回到起點,亦即只允許其中兩個頂點的分支度是奇數,其餘則必須全部為偶數,符合這樣的結果就稱為尤拉鏈(Eulerian chain) 。
5
圖形介紹
圖形的種類有兩種:一是無向圖形,一是有向圖形。
無向圖形以 (V1,V2) 表示邊線。有向圖形則以 <V1,V2> 表示其邊線。
6
圖形專有名詞簡介
完整圖形:在「無向圖形」中, N 個頂點正好有 N(N-1)/2 條邊,則稱為「完整圖形」。
但在「有向圖形」中,若要稱為「完整圖形」,則必須有 N(N-1) 個邊。
( 完整無向圖形 ) ( 完整有向圖形 )
7
子圖: G 的子圖 G' 與 G” 包含於 G ,如下圖所示:
G G' G"
G' 及 G" 都是 G 的子圖
8
路徑:兩個不同頂點間所經過的邊稱為路徑,如上圖 G , A 到 E 的路徑有 {(A,B) 、 (B,E)}及 {(A,B) 、 (B,C) 、 (C,D) 、 (D,E)} 等等。
循環:起始頂點及終止頂點為同一個點的簡單路徑稱為循環。
相連:在無向圖形中,若頂點 Vi 到頂點 Vj 間存在路徑,則 Vi 和 Vj 是相連的。
相連圖形:如果圖形 G 中,任兩個頂點均為相連,則此圖形稱為相連圖形。
9
路徑長度:路徑上所包含邊的總數為路徑長度。相連單元:圖形中相連在一起的最大子圖總數。強相連:在有向圖形中,若兩頂點間有兩條方
向相反的邊稱為強相連。分支度:在無向圖形中,一個頂點所擁有邊的
總數為分支度。如上頁圖 G , A 頂點的分支度為 4 。
10
入 / 出分支度:在有向圖形中,以頂點 V 為箭頭終點的邊之個數為入分支度,反之由 V出發的箭頭總數為出分支度。
如下圖, A 的入支度為 1 ,出分支度為 3 。
11
範例 7.2.1 請問以下哪些是圖形的應用 (Application) ?
(1) 工作排程 (2) 遞迴程式 (3) 電路分析 (4) 排序 (5) 最短路徑尋找 (6) 模擬 (7) 副程式呼叫 (8) 都市計劃
12
圖形表示法
相鄰矩陣法相鄰串列法相鄰多元串列法 索引表格法
13
相鄰矩陣法
圖形 A 有 n 個頂點,以 n*n 的二維矩陣列表示。此矩陣的定義如下:
對於一個圖形 G=(V,E) ,假設有 n個頂點, n≧1,則可以將 n個頂點的圖形,利用一個 n×n二維矩陣來表示,其中假如 A(i,j)=1 ,則表示圖形中有一條邊 (Vi,Vj) 存在。反之, A(i,j)=0 ,則沒有一條邊 (Vi,Vj) 存在。
14
相關特性說明
1. 對無向圖形而言,相鄰矩陣一定是對稱的,而且對角線一定為 0 。
2. 在無向圖形中,任一節點 i 的分支度為 ,就是第 i 列所有元素的和。在有向圖中,節點 i 的出分支度為 ,就是第 i 列所有元素的和。
3. 用相鄰矩陣法表示圖形共需要 n2 空間,僅需儲存上三角形或下三角形的資料即可,因此僅需 n
(n-1)/2 空間。
n
j
jiA1
),(
n
j
jiA1
),(
15
範例程式: ch07_01.java
16
範例 7.3.1 請以相鄰矩陣表示下列有向圖。
和無向圖形的作法一樣,找出相鄰的點並把邊連接的兩個頂點矩陣值填入 1 。如下表所示:
17
範例程式: ch07_02.java
18
相鄰串列法
這種表示法是以串列結構來表示圖形,它有點類似相鄰矩陣,不過忽略掉矩陣中 0 的部份,直接把 1 的部份放入節點裡。
相關特性說明如下:1. 每一個頂點使用一個串列。2. 在無向圖中, n 頂點 e 邊共需 n 個串列首節點及 2*e 個節點;有向圖則需 n 個串列首節點及 e 個節點。在相鄰串列中,計算所有頂點分支度所需的時間複雜度 O(n+e) 。
19
範例程式: ch07_03.java
20
相鄰矩陣法及相鄰串列優缺點優
缺點表
示法
優點 缺點
相鄰矩陣法 實作簡單計算分支度相當方便要在圖形中加入新邊時,這個表示法的插入與刪除相當簡易
如果頂點與頂點間的路徑不多時,易造成稀疏矩陣,而浪費空間計算所有頂點的分支度時,其時間複雜度為 O(n2)
相鄰串列法 和相鄰矩陣相比較節省空間計算所有頂點的分支度時,其時間複雜度為O(n+e),較相鄰矩陣法來得快
欲求入分支度時,必須先求其反轉串列圖形新邊的加入或刪除會更動到相關的串列鏈結,較為麻煩費時
21
相鄰多元串列法
相鄰多元串列的節點是存放邊線的資料,其結構如下:
M V1 V2 LINK1 LINK2
記錄單元 邊線起點 邊線終點 起點指標 終點指標
22
相鄰多元串列相關特性
1. M :是記錄該邊是否被找過的一個位元之欄位。2. V1 及 V2 :是所記錄的邊的起點與終點。3. LINK1 :在尚有其它頂點與 V1 相連的情況下,此欄位會指向下一個與 V1 相連的邊節點,如果已 經沒有任何頂點與 V1 相連時,則指向 NULL 。4. LINK2 :在尚有其它頂點與 V2 相連的情況下,此欄位會指向下一個與 V2 相連的邊節點,如果已經沒有任何頂點與 V2 相連時,則指向 NULL 。
23
索引表格法
是一種用一維陣列來依序儲存與各頂點相鄰的所有頂點,並建立索引表格,來記錄各頂點在此一維陣列中第一個與該頂點相鄰的位置。
也就是說若圖形有 n 個頂點,就必須建立 n 個索引位置的表格,來記錄一維陣列中分別與這 n 個頂點第一個相鄰的頂點位置。
24
範例 7.3.2 下圖為尤拉七橋問題的圖示法, A,B,C,D 為四島,
1,2,3,4,5,6,7 為七橋,今欲以不同之資料結構描述此圖,試說明三種不同的表示法。
25
相鄰矩陣 (Adjacency Matrix)
令圖形 G=(V,E) 共有 n 個頂點,我們以 n*n 的二維矩陣來表示點與點之間是否相鄰。其中aij=0 表示頂點 i及 j頂點沒有相鄰的邊aij=1 表示頂點 i及 j頂點有相鄰的邊
26
相鄰串列法 (Adjacency Lists)
27
索引表格法 (Indexed Table)
是一種用一個一維陣列,來依序儲存與各頂點相鄰的所有頂點,並建立索引表格,來記錄各頂點在此一維陣列中第一個與該頂點相鄰的位置。
28
圖形的追蹤
圖形追蹤的定義如下:
從某一個頂點 V1開始,走訪可以經由 V1 到達的頂點,接著再走訪下一個頂點直到全部的頂點走訪完畢為止。
圖形走訪的方法有兩種:「先深後廣走訪」及「先廣後深走訪」。
一個圖形 G=(V,E) ,存在某一頂點 vV ,我們希望從 v開始,經由此節點相鄰的節點而去拜訪 G中其它節點,這稱之為「圖形追蹤」。
29
先深後廣法 是從圖形的某一頂點開始走訪,被拜訪過的頂點
就做上已拜訪的記號。 接著走訪此頂點的所有相鄰且未拜訪過的頂點中
的任意一個頂點,並做上已拜訪的記號,再以該點為新的起點繼續進行先深後廣的搜尋。
這種圖形追蹤方法結合了遞迴及堆疊兩種資料結構的技巧,由於此方法會造成無窮迴路,所以必須加入一個變數,判斷該點是否已經走訪完畢。
30
範例程式: ch07_04.java
31
先廣後深法
先廣後深 (Breadth-First Search, BFS) 走訪方式則是以佇列及遞迴技巧來走訪,也是從圖形的某一頂點開始走訪,被拜訪過的頂點就做上已拜訪的記號。
接著走訪此頂點的所有相鄰且未拜訪過的頂點中的任意一個頂點,並做上已拜訪的記號,再以該點為新的起點繼續進行先廣後深的搜尋。
32
範例程式: ch07_05.java
33
擴張樹
擴張樹又稱「花費樹」或「值樹」,其定義如下:
所以一個有 n 頂點的無向圖形擴張樹,則一定有 n-1 個邊。
以一個嚴謹的定義,假設圖形 G=(V,E) ,將所有的邊分成兩個集合 T 及 B ,其中 T 為拜訪過程中所經過的邊, B 則為訪過程未經過的邊。
一個圖形的擴張樹是以最少的邊來連結圖形中所有的頂點,且不造成循環 (Cycle) 的樹狀結構。
34
擴張樹的特點
擴張樹是由所有頂點及拜訪過程經過的邊所組成,令 S=(V,T) 為圖形 G 中的擴張樹(spanning tree) ,該擴張樹具有底下幾個特點:
① E=T+B② 將集合 B中的任一邊加入集合 T中,就會造成迴圈。
③ V 中任意兩個頂點 Vi 及 Vj ,在擴張樹 S中存在唯一
的一條簡單路徑。
35
範例 7.5.1求出下圖的 DFS 與 BFS 結果。
36
MST擴張樹假設我們在樹的邊加上一個權重 (weight) 值,
這種圖形就成為「加權圖形 (Weighted Graph) 」。
如果這個權重值代表兩個頂點間的距離 (distance) 或成本 (COST) ,這類圖形就稱為網路(Network) 。如下圖所示:
37
Prim演算法
Prim演算法又稱 P氏法,對一個加權圖形 G=
(V,E) ,設 V={1,2,……n} ,假設 U={1} ,也就是說, U 及 V 是兩個頂點的集合。
U-V差集所產生的集合中找出一個頂點 x ,該頂點 x 能與 U集合中的某點形成最小成本的邊,且不會造成迴圈。
然後將頂點 x加入 U集合中,反覆執行同樣的步驟,一直到 U集合等於 V集合 ( 即 U=V) 為止。
38
Kruskal演算法
Kruskal演算法是將各邊線依權值大小由小到大排列,接著從權值最低的邊線開始架構最小成本擴張樹。
如果加入的邊線會造成迴路則捨棄不用,直到加入了 n-1 個邊線為止。
39
範例程式: ch07_06.java
40
圖形最短路徑
在一個有向圖形 G=(V,E) , G 中每一個邊都有一個比例常數 W(Weight) 與之對應。
如果想求 G 圖形中某一個頂點 V0 到其它頂點的的最少W 總和之值,這類問題就稱為最短路徑問題 (The Shortest Path Proble
m) 。
41
單點對全部頂點
一個頂點到多個頂點通常使用 Dijkstra演算法求得, Dijkstra 的演算法如下:假設 S={Vi|Vi V} ,且 Vi 在已發現的最短路徑,
其中 V0 S 是起點。 下列幾點特性
1. 如果 u 是目前所找到最短路徑之下一個節點,則 u 必屬於 V-S
集合中最小花費成本的邊。
2. 若 u 被選中,將 u加入 S集合中,則會產生目前的由 V0 到 u
最短路徑,對於 w S , DIST(w) 被改變成 DIST(w)Min{DIST
(w),DIST(u)+COST(u,w)}
42
範例程式: ch07_07.java
43
頂點兩兩之間的最短距離
由於 Dijkstra 的方法只能求出某一點到其他頂點的最短距離,如果要求出圖形中任兩點甚至所有頂點間最短的距離,就必須使用 Floyd演算法。
Floyd演算法定義:1. Ak[i][j]=min{Ak-1[i][j],Ak-1[i][k]+Ak-1[k][j]} , k 1k≧ 表示經 過的頂點, Ak[i][j] 為從頂點 i 到 j 的經由 k 頂點的最短路徑。2. A0[i][j]=COST[i][j](即 A0便等於 COST)3. A0 為頂點 i 到 j 間的直通距離。4. An[I,j]代表 i 到 j 的最短距離,即 An便是我們所要求的最
短路 徑成本矩陣。
44
範例程式: ch07_08.java
45
AOV網路與拓樸排序
以圖形嚴謹的定義來說, AOV網路就是一種有向圖形,在這個有向圖形中的每一個節點代表一項工作或必須執行的動作。
那些有方向性的邊則代表了工作與工作之間存在的先後關係順序。
也就是說, <ViVj> 表示必須處理先完 Vi 的工作,才可以進行 Vj 的工作。
46
AOV網路專有名詞
1.先行者:若頂點 Vi 的工作必須先完成後,才能進
行 Vj 頂點的工作,則稱 Vi 為 Vj 的「先行者」。
2. 拓樸排序與拓樸序列:如果在 AOV網路中,具有部
份次序的關係 ( 即有某幾個頂點為先行者 ) ,拓樸排序的功能就是將這些部份次序 (Partial Order) 的關係,轉換成線性次序 (Linear Order) 的關係。
47
拓樸排序與拓樸序列
產生拓樸序列必須存在的條件是一個非循環圖形,由於 AOV網路代表各項小工作的先後完成順序圖,所以沒有循環的問題,也就是說 AOV網路經過拓樸排序後可以產生有線性次序關係拓樸序列。
在一個 AOV網路經過拓樸排序後所產生的拓樸序列可能有一個以上,亦即拓樸序列並不是唯一的。
48
拓樸排序實作
拓樸排序的步驟:步驟 1 尋找圖形中任何一個沒有先行者的頂點。
步驟 2 輸出此頂點,並將此頂點的所有邊刪除。
步驟 3 重複上兩個步驟處理所有頂點。
49
AOE網路
所謂 AOE 是指事件 (event) 的行動 (action) 在邊上的有向圖形。
在 AOE網路會有一個源頭頂點和目的頂點。 從源頭頂點開始計時執行各邊上事件的行動,
到目的頂點完成為止所需的時間為所有事件完成的時間總花費。
50
臨界路徑
臨界路徑就是 AOE 有向圖形從源頭頂點到目的頂點間所需花費時間最長的一條有方向性的路徑。
當有一條以上的花費時間相等,而且都是最長,則這些路徑都稱為此 AOE 有向圖形的臨界路徑 (critical path) 。
想縮短整個 AOE 完成的花費時間,必須設法縮短臨界路徑各邊行動所需花費的時間。
51
臨界路徑乃是用來決定一個計劃至少需要多少時間才可以完成。
亦即在 AOE 有向圖形中從源頭頂點到目的頂點間最長的路徑長度。我們看下圖:
52
相關定義
上圖代表 12 個 action(a1,a2,a3,a4…,a12) 及 10個 event(v1,v2,v3…V10) ,我們先看看一些重要相關定義: 最早時間 (earlest time)
為該頂點最早可以開始其外出邊事件 (incident out edge) 的時間,它必須由最慢完成的進入邊事件所控制,我們用 TE 表示。
最晚時間 (latest time)為該頂點最慢可以開始其外出邊事件 (incident out edge) 而不會影響整個 AOE網路完成的時間。我們以 TL 表示。
53
臨界頂點 (critical vertex) AOE網路中頂點的 TE=TL ,我們就稱它為臨界頂
點。從源頭頂點到目的頂點的各個臨界頂點可以構成一條或數條的有向臨界路徑。我們以下圖為例來簡單說明如何決定臨界路徑:
54
由上圖得知 V1,V4,V6,V8,V9,V10 為臨界頂點(critical vertex) ,可以求得如下的臨界路徑(critical path) :