Graph Traversal
- 目的:
- 圖形中的所有頂點都被拜訪到,且僅被拜訪到一次
- 拜訪方式有兩種:
Depth First Search
(DFS;深先搜尋,需利用 Stack)Breadth First Search
(BFS;廣先搜尋,需利用 Queue)
- 應用:
- 不論是採用何種圖形追蹤方法,在實作上皆可引入一個
visited flag
(拜訪旗標),以指出頂點的目前状況- Flag = 0:尚未拜訪 (not processed)
- Flag = 1:拜訪中 (in queue or stack)
- Flag = 2:已拜訪 (processed)
Depth-First Traversal
走訪起始頂點 v,然後選擇一個相鄰至 v 且尚未被拜訪過的頂點 w;以w為起始點再做 Depth-First 追蹤。如果從任何已拜訪過的頂點,都無法再拜訪到一個尚未被走過的頂點時,則結束拜訪
包含遞迴
應用的概念,因此可利用 Stack
保存走訪過程中間所走過的點
- Steps:
- 選擇一起始拜訪頂點 (可任選) ,將它 Push 到 stack 中
- 若 Stack 不為空,則
- 從 Stack 中 Pop 一個頂點 (視為已拜訪頂點),並將
此頂點所有相鄰之其它未拜訪頂點
Push 到 Stack 中。 (重覆執行) - 若所有頂點皆已被拜訪過,而 Stack 仍不為空時,則將 Stack 清空
- 從 Stack 中 Pop 一個頂點 (視為已拜訪頂點),並將
- 若 Stack 為空,則追蹤程序完成
- 若 Stack 不為空,則
例:
Ans:
- DFS 之順序
並不唯一
- 起始頂點可任選
- 每個頂點的分枝路徑可任選
- 除非規定 “拜訪時,依 Node 編號
由小到大
拜訪” 才會唯一 (上面答案就是)
例: 承上圖,下列何者不為 DFS 之 Order?
- 1, 2, 5, 8, 6, 3, 7, 4
- 1, 3, 6, 8, 5, 2, 4, 7
- 1, 3, 7, 8, 6, 5, 2, 4
- 1, 2, 4, 8, 6, 3, 7, 5
- 1, 3, 7, 8, 5, 4, 2, 6
Ans: e
Breadth-First Traversal
由起始頂點 v 開始走訪。所有相鄰至 v 且尚未被拜訪過的頂點,都會在下個步驟裡一一被走訪。而相鄰至這些被走訪頂點且尚未走過的頂點,又將被一一走訪;重複上述,直到無頂點可被拜訪為止
- Steps:
- 選擇一起始拜訪頂點 (可任選) ,將它放入 Queue 中
- 若 Queue 不為空,則
- 從 Queue 的前端移出一個頂點 (視為已拜訪頂點),並將此頂點
所有相鄰之其它未拜訪頂點放入 Queue 中
。 (重覆執行)
- 從 Queue 的前端移出一個頂點 (視為已拜訪頂點),並將此頂點
- 若 Queue 為空,則追蹤程序完成
- 若 Queue 不為空,則
Ans:
- BFS 之順序
並不唯一
- 除非規定 “拜訪時,依 Node 編號
由小到大
拜訪” 才會唯一 (上面答案就是)
AOV (Activity On Vertex) Network
- 假設 G = <V, E> 為一個 Directed grapth,其中
Vertex
表示工作(Activity),Edge
表示工作執行之先後次序關係 - E.g.
,表示 工作必須先於 執行,稱 G 為 AOV Network - 應用: 求合理的工作執行順序 ⇒ 即: Topological Order (拓樸順序)
Topological Order (拓樸順序)
給定一個不具 Cycle
的 AOV Network,則可以定出 ≥ 1 組 Vertex (或稱 job ) 的拜訪順序,且此順序須滿足: “若在 AOV Network,
例: 請列出下圖的其中一組 Topological Order
- 找出一個
無前導
的頂點 (Indegree = 0) - 將此頂點輸出,且
刪除此點所 Leading-out 之 edge
- Repeat 1~2,直到
所有 Vertex 已輸出
,或剩下的點皆有前導存在
- If “不是所有點皆輸出” then “No Topological Order 存在”
Ans:
- 若 AOV Network 有 cycle,則無 Topological Order。(∵ 無法決定誰先做)
- 不具 cycle 的 AOV Network,其 Topological Order ≥ 1組。 (不一定唯一)
AOV Network 之資料結構表示
做法:
- 利用
Adjacency List
,並在相鄰串列 Vertex[1…n] 中多加一個欄位:count 欄
,用以記錄 vertex 的射入邊數 (即:in-degree) - 如何實作 “
刪除某 vertex 所 Leading-out 之 edge
” 的動作?- 從該 vertex 的相鄰串列中,找出與之相鄰的其它頂點
- 將這些頂點的 count 欄之值
減1
- ∵ 刪除某 vertex 所 Leading-out 之 edge = 降低與該 vertex 相鄰之所有頂點的 in-degree 數目。(沒有實質的 “刪除邊” 之動作)
範例:
- 找出一個
無前導
的頂點 (Indegree = 0) - 將此頂點輸出,且
刪除此點所 Leading-out 之 edge
- Repeat 1~2,直到
所有 Vertex 已輸出
,或剩下的點皆有前導存在
- If “不是所有點皆輸出” then “No Topological Order 存在”
\[ ... \]
Ans:
AOE Network
G = (V, E) 有向圖,以 Edge
表示工作 (Activity),Vertex
表示事件 (Event),Edge 上具有加權值,表示工作完成所需的時數
- 事件發生,射出工作 (leading out) 才可以開始執行
- 所有射入工作完成,事件才會發生
- 完成此計畫所需之最少(最起碼)的工作時數?
- 求從 Start → End 事件之
最長路徑
長度 - 即: 求
Critical path (臨界路徑)
的長度
- 求從 Start → End 事件之
- 上圖的可能路徑有(取部份為例):
(時數= 18) (時數= 18) (時數= 18) (時數= 18) (時數= 14) (時數= 11) - 最長路徑的長度為 18,因此有四條路徑為 Critical path
- 前例所有的臨界路徑有:
(時數= 18) (時數= 18) (時數= 18) (時數= 18) - 交集的工作為
,此即為 Critical Task。若加速此工作,則有助於縮短完成時間。