570 likes | 1.06k Views
第七章 圖形結構. 7-1 圖形的起源 7-2 圖形介紹 7-3 圖形表示法 7-4 圖形的追蹤. 7-5 擴張樹 7-6 MST 擴張樹 7-7 圖形最短路徑 7-8 AOV 網路與拓樸排序. 圖形的起源. 下圖為「肯尼茲堡橋樑」問題的簡圖,尤拉所思考的問題是這樣的,「如何在只經過每一座橋樑一次的情況下,把所有地方走過一次而且回到原點。」. 尤拉環與尤拉鏈. 尤拉環 「當所有頂點的分支度皆為偶數時,才能從某頂點出發,經過每一邊一次,再回到起點。」
E N D
第七章 圖形結構 7-1 圖形的起源 7-2 圖形介紹 7-3 圖形表示法 7-4 圖形的追蹤 7-5 擴張樹 7-6 MST擴張樹 7-7 圖形最短路徑 7-8 AOV網路與拓樸排序
圖形的起源 • 下圖為「肯尼茲堡橋樑」問題的簡圖,尤拉所思考的問題是這樣的,「如何在只經過每一座橋樑一次的情況下,把所有地方走過一次而且回到原點。」
尤拉環與尤拉鏈 • 尤拉環 • 「當所有頂點的分支度皆為偶數時,才能從某頂點出發,經過每一邊一次,再回到起點。」 • 在下圖中每個頂點的分支度都是奇數,所以尤拉所思考的問題是不可能發生的,這個理論就是有名的「尤拉環」(Eulerian cycle)理論。 尤拉環
尤拉鏈 • 如果條件改成從某頂點出發,經過每邊一次,不一定要回到起點,亦即只允許其中兩個頂點的分支度是奇數,其餘則必須全部為偶數,符合這樣的結果就稱為尤拉鏈(Eulerian chain)。
圖形介紹 • 圖形的種類有兩種:一是無向圖形,一是有向圖形。 • 無向圖形以(V1,V2)表示邊線。 • 有向圖形則以<V1,V2>表示其邊線。
(完整無向圖形) (完整有向圖形) 圖形專有名詞簡介 • 完整圖形:在「無向圖形」中,N個頂點正好有N(N-1)/2條邊,則稱為「完整圖形」。 • 但在「有向圖形」中,若要稱為「完整圖形」,則必須有N(N-1)個邊。
子圖:G的子圖G'與G”包含於G,如下圖所示: G' G" G G'及G"都是G的子圖
路徑:兩個不同頂點間所經過的邊稱為路徑,如上圖G,A到E的路徑有{(A,B)、(B,E)}及{(A,B)、(B,C)、(C,D)、(D,E)}等等。路徑:兩個不同頂點間所經過的邊稱為路徑,如上圖G,A到E的路徑有{(A,B)、(B,E)}及{(A,B)、(B,C)、(C,D)、(D,E)}等等。 • 循環:起始頂點及終止頂點為同一個點的簡單路徑稱為循環。 • 相連:在無向圖形中,若頂點Vi到頂點Vj間存在路徑,則Vi和Vj是相連的。 • 相連圖形:如果圖形G中,任兩個頂點均為相連,則此圖形稱為相連圖形。
路徑長度:路徑上所包含邊的總數為路徑長度。路徑長度:路徑上所包含邊的總數為路徑長度。 • 相連單元:圖形中相連在一起的最大子圖總數。 • 強相連:在有向圖形中,若兩頂點間有兩條方向相反的邊稱為強相連。 • 分支度:在無向圖形中,一個頂點所擁有邊的總數為分支度。如上頁圖G,A頂點的分支度為4。
入/出分支度:在有向圖形中,以頂點V為箭頭終點的邊之個數為入分支度,反之由V出發的箭頭總數為出分支度。入/出分支度:在有向圖形中,以頂點V為箭頭終點的邊之個數為入分支度,反之由V出發的箭頭總數為出分支度。 • 如下圖,A的入支度為1,出分支度為3。
範例 7.2.1 • 請問以下哪些是圖形的應用(Application)? • (1)工作排程 (2)遞迴程式 (3)電路分析 (4)排序 (5)最短路徑尋找 (6)模擬 (7)副程式呼叫 (8)都市計劃
圖形表示法 • 相鄰矩陣法 • 相鄰串列法 • 相鄰多元串列法 • 索引表格法
相鄰矩陣法 • 圖形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)存在。
相關特性說明 • 1.對無向圖形而言,相鄰矩陣一定是對稱的,而且對角線一定為0。 • 2.在無向圖形中,任一節點i的分支度為 ,就是第i列所有元素的和。在有向圖中,節點i的出分支度為 ,就是第i列所有元素的和。 • 3.用相鄰矩陣法表示圖形共需要n2空間,僅需儲存上三角形或下三角形的資料即可,因此僅需n(n-1)/2空間。
範例 7.3.1 • 請以相鄰矩陣表示下列有向圖。 • 和無向圖形的作法一樣,找出相鄰的點並把邊連接的兩個頂點矩陣值填入1。如下表所示:
相鄰串列法 • 這種表示法是以串列結構來表示圖形,它有點類似相鄰矩陣,不過忽略掉矩陣中0的部份,直接把1的部份放入節點裡。 • 相關特性說明如下: • 1.每一個頂點使用一個串列。 • 2.在無向圖中,n頂點e邊共需n個串列首節點及2*e個節點;有向圖則需n個串列首節點及e個節點。在相鄰串列中,計算所有頂點分支度所需的時間複雜度O(n+e)。
優 缺 表 點 示 法 相鄰矩陣法及相鄰串列優缺點
相鄰多元串列法 • 相鄰多元串列的節點是存放邊線的資料,其結構如下:
相鄰多元串列相關特性 • 1. M:是記錄該邊是否被找過的一個位元之欄位。 • 2. V1及V2:是所記錄的邊的起點與終點。 • 3. LINK1:在尚有其它頂點與V1相連的情況下,此欄位會指向下一個與V1相連的邊節點,如果已 經沒有任何頂點與V1相連時,則指向NULL。 • 4. LINK2:在尚有其它頂點與V2相連的情況下,此欄位會指向下一個與V2相連的邊節點,如果已經沒有任何頂點與V2相連時,則指向NULL。
索引表格法 • 是一種用一維陣列來依序儲存與各頂點相鄰的所有頂點,並建立索引表格,來記錄各頂點在此一維陣列中第一個與該頂點相鄰的位置。 • 也就是說若圖形有n個頂點,就必須建立n個索引位置的表格,來記錄一維陣列中分別與這n個頂點第一個相鄰的頂點位置。
範例 7.3.2 • 下圖為尤拉七橋問題的圖示法,A,B,C,D為四島,1,2,3,4,5,6,7為七橋,今欲以不同之資料結構描述此圖,試說明三種不同的表示法。
相鄰矩陣(Adjacency Matrix) • 令圖形G=(V,E)共有n個頂點,我們以n*n的二維矩陣來表示點與點之間是否相鄰。其中 aij=0表示頂點i及j頂點沒有相鄰的邊 aij=1表示頂點i及j頂點有相鄰的邊
索引表格法(Indexed Table) • 是一種用一個一維陣列,來依序儲存與各頂點相鄰的所有頂點,並建立索引表格,來記錄各頂點在此一維陣列中第一個與該頂點相鄰的位置。
圖形的追蹤 • 圖形追蹤的定義如下: • 從某一個頂點V1開始,走訪可以經由V1到達的頂點,接著再走訪下一個頂點直到全部的頂點走訪完畢為止。 • 圖形走訪的方法有兩種:「先深後廣走訪」及「先廣後深走訪」。 一個圖形G=(V,E),存在某一頂點vV,我們希望從v開始,經由此節點相鄰的節點而去拜訪G中其它節點,這稱之為「圖形追蹤」。
先深後廣法 • 是從圖形的某一頂點開始走訪,被拜訪過的頂點就做上已拜訪的記號。 • 接著走訪此頂點的所有相鄰且未拜訪過的頂點中的任意一個頂點,並做上已拜訪的記號,再以該點為新的起點繼續進行先深後廣的搜尋。 • 這種圖形追蹤方法結合了遞迴及堆疊兩種資料結構的技巧,由於此方法會造成無窮迴路,所以必須加入一個變數,判斷該點是否已經走訪完畢。
先廣後深法 • 先廣後深(Breadth-First Search, BFS)走訪方式則是以佇列及遞迴技巧來走訪,也是從圖形的某一頂點開始走訪,被拜訪過的頂點就做上已拜訪的記號。 • 接著走訪此頂點的所有相鄰且未拜訪過的頂點中的任意一個頂點,並做上已拜訪的記號,再以該點為新的起點繼續進行先廣後深的搜尋。
擴張樹 • 擴張樹又稱「花費樹」或「值樹」,其定義如下: • 所以一個有n頂點的無向圖形擴張樹,則一定有n-1個邊。 • 以一個嚴謹的定義,假設圖形G=(V,E),將所有的邊分成兩個集合T及B,其中T為拜訪過程中所經過的邊,B則為訪過程未經過的邊。 一個圖形的擴張樹是以最少的邊來連結圖形中所有的頂點,且不造成循環(Cycle)的樹狀結構。
擴張樹的特點 • 擴張樹是由所有頂點及拜訪過程經過的邊所組成,令S=(V,T)為圖形G中的擴張樹(spanning tree),該擴張樹具有底下幾個特點: • E=T+B • 將集合B中的任一邊加入集合T中,就會造成迴圈。 • V中任意兩個頂點Vi及Vj,在擴張樹S中存在唯一的一條簡單路徑。
範例 7.5.1 求出下圖的DFS與BFS結果。
MST擴張樹 • 假設我們在樹的邊加上一個權重(weight)值,這種圖形就成為「加權圖形(Weighted Graph)」。 • 如果這個權重值代表兩個頂點間的距離(distance)或成本(COST),這類圖形就稱為網路(Network)。如下圖所示:
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)為止。
Kruskal演算法 • Kruskal演算法是將各邊線依權值大小由小到大排列,接著從權值最低的邊線開始架構最小成本擴張樹。 • 如果加入的邊線會造成迴路則捨棄不用,直到加入了n-1個邊線為止。
圖形最短路徑 • 在一個有向圖形G=(V,E),G中每一個邊都有一個比例常數W(Weight)與之對應。 • 如果想求G圖形中某一個頂點V0到其它頂點的的最少W總和之值,這類問題就稱為最短路徑問題(The Shortest Path Problem) 。
單點對全部頂點 • 一個頂點到多個頂點通常使用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)}
頂點兩兩之間的最短距離 • 由於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便是我們所要求的最短路 徑成本矩陣。
AOV網路與拓樸排序 • 以圖形嚴謹的定義來說,AOV網路就是一種有向圖形,在這個有向圖形中的每一個節點代表一項工作或必須執行的動作。 • 那些有方向性的邊則代表了工作與工作之間存在的先後關係順序。 • 也就是說,<ViVj>表示必須處理先完Vi的工作,才可以進行Vj的工作。
AOV網路專有名詞 1.先行者:若頂點Vi的工作必須先完成後,才能進 行Vj頂點的工作,則稱Vi為Vj的「先行者」。 2.拓樸排序與拓樸序列:如果在AOV網路中,具有部 份次序的關係(即有某幾個頂點為先行者),拓樸排 序的功能就是將這些部份次序(Partial Order)的關 係,轉換成線性次序(Linear Order)的關係。
拓樸排序與拓樸序列 產生拓樸序列必須存在的條件是一個非循環圖形,由於AOV網路代表各項小工作的先後完成順序圖,所以沒有循環的問題,也就是說AOV網路經過拓樸排序後可以產生有線性次序關係拓樸序列。 在一個AOV網路經過拓樸排序後所產生的拓樸序列可能有一個以上,亦即拓樸序列並不是唯一的。
拓樸排序實作 • 拓樸排序的步驟: 步驟1 尋找圖形中任何一個沒有先行者的頂點。 步驟2 輸出此頂點,並將此頂點的所有邊刪除。 步驟3 重複上兩個步驟處理所有頂點。
AOE網路 • 所謂AOE是指事件(event)的行動(action)在邊上的有向圖形。 • 在AOE網路會有一個源頭頂點和目的頂點。 • 從源頭頂點開始計時執行各邊上事件的行動,到目的頂點完成為止所需的時間為所有事件完成的時間總花費。
臨界路徑 • 臨界路徑就是AOE有向圖形從源頭頂點到目的頂點間所需花費時間最長的一條有方向性的路徑。 • 當有一條以上的花費時間相等,而且都是最長,則這些路徑都稱為此AOE有向圖形的臨界路徑(critical path)。 • 想縮短整個AOE完成的花費時間,必須設法縮短臨界路徑各邊行動所需花費的時間。