Please enable JavaScript.
Coggle requires JavaScript to display documents.
CH6 (Connected Graph(連通圖) (Connected Component (最大的聯通子圖,…
CH6
Connected Graph(連通圖)
每個頂點對之間都有路徑存在
Connected Component
最大的聯通子圖
連通圖只會有
1
個component
Cycle與聯通性
去除掉cycle上的一個邊,不會影響到整張圖的聯通性
最短路徑問題
適用於"有方向性、有權重"的graph
Dijkstra Algorithm
說明 : single source to all vertices
時間複雜度
O(n^2)
說明
選擇下一個頂點 : O(n)
更新距離 : O(n)
Using Fibonacci heap: O(nlogn+e)
尋找所有頂點對的最短路徑
時間複雜度 : O(n^3) ->把每個點都做一次 Dijkstra
Complete Undirected Graph
可以連的邊通通連起來
邊數 : C(n,2)/2 = n(n-1)/2
Vertex Degree
無向圖
degree : 射入點數目
sum of degree : 2e(e為邊數)
有向圖
In-degree : 射入點數目
Out-degree : 射出點數目
sum of In/Out-degree :e
Graph Representation
Adjacency Matrix
說明
一個n*n的矩陣
A(i,j) = 1 iff (i,j)有通
性質
對角線必為零(自己跟自己)
對稱性
無向圖 => O
有向圖 => X
空間需求 : n^2
無向圖
(n-1)n/2
說明 : 只需儲存上三角或下三角,並排除對角線
時間分析
查詢頂點degree : O(n)
Adjacency Lists
Linked Adjacency Lists
chain node數量
無向圖 : 2e
有向圖 : e
Graph types
Directed and undirected
Weighted and unweighted (有無權重)
Search Methods
DFS
時間複雜度
adjacency matrix : O(n^2)
說明
查找每個點有哪些鄰居 : O(n)
總共有n個點 = > O(n*n)
adjacency lists : O(e)
哪一個好呢?
邊多 => 用matrix
點多 => 用list
BFS
時間複雜度同DFS
Spanning Tree
定義
為connected、且不含cycle的一棵樹
若原圖有n個頂點,則展開數有n個頂點、n-1條邊
Minimum-cost Spanning Tree (最小成本展開樹)
方法
Kruskal’s Method
步驟
(1)將每個點各自獨立成一顆樹,形成森林
(2)取出最小成本的邊,放到圖中
(3)若不形成cycle,保留; 若形成cycle,捨棄。
(4)成功取出n-1條邊,串聯起每個頂點且,不含cycle =>完成
說明
如何判斷是否形成cycle : 串連的兩頂點不再同一個component當中,就不會形成cycle
Prim’s method (比kruskal快)
步驟
(1)另V = {1,2,3,...,n}, U = {1} //start vertex
(2)挑出最小成本的邊(u,v), 且u屬於U,且v屬於V-U
(3)將(u,v)加到Set當中,直到U=V或E沒有邊為止
(4)若邊數 == v-1 代表有展開樹; 否則,無。
時間複雜度
Kruskal’s
方法
將每個點視為獨立root,將最小成本邊加入,若形成cycle,捨棄。否則,保留。
時間複雜度
使用union-find trees : O(n + e log e)
說明 :
初始 : O(n)
移除、取出對小成本邊 : O(e)*O(log e) (邊數、樹高)
Prim’s
方法
每次都將最短邊加入(樹中的點可連到的)
時間複雜度
使用Dijkstra’s最短路徑演算法 : O(n^2)
使用Fibonacci heap : O(e + n log n)
Sollin’s
步驟
(1)將各頂點視為獨立的tree之root
(2)從各別的樹,選出最小成本的樹邊
(3)刪除重複挑出來的tree edge
(4)重複1~3,直到只剩一顆樹或E為空為止
Complete Directed Graph
邊數 : C(n,2) = n(n-1)