歡迎來到圖遍歷(Graph Traversal)的世界!
在本章中,我們將學習電腦如何「走遍」一個圖(graph)來尋找資訊。無論是 Google 地圖幫你找出前往最愛披薩店的最快路線,還是 Facebook 向你推薦新朋友,圖遍歷演算法都是實現這些功能的幕後功臣。
如果一開始覺得圖看起來有點雜亂,別擔心——看完這些筆記後,你就會發現它們其實就是等待被破解的邏輯謎題!
先修知識:什麼是圖(Graph)?
在我們進行「遍歷」(Traverse,其實就是「訪問」的高級說法)之前,先來複習一下圖的組成:
- 頂點(Vertices 或 Nodes): 圖中的點或「圓圈」(就像地圖上的城市)。
- 邊(Edges 或 Arcs): 連接節點的線(就像城市之間的道路)。
1. 廣度優先搜尋(Breadth-First Search,簡稱 BFS)
你可以把 廣度優先搜尋 想像成「池塘裡的漣漪」。你從一個點出發,先探索所有最近的鄰居,然後再擴散到下一層,以此類推。
「逐層推進」策略
BFS 採用 逐層(layer by layer) 方式探索圖。你會先訪問距離為 1 的所有節點,接著是距離為 2 的所有節點,等等。為了記錄接下來要訪問哪些節點,BFS 會使用 佇列(Queue) 資料結構(先進先出,First-In, First-Out)。
步驟詳解:
1. 選擇一個起始節點,並將其標記為 已訪問(visited)。
2. 將所有 直接相鄰的鄰居 加入 佇列(Queue)。
3. 從佇列中取出第一個節點。
4. 如果該節點尚未被訪問,則將其標記為已訪問,並將 該節點的所有鄰居 加入佇列的末端。
5. 重複以上步驟,直到佇列為空。
現實生活中的比喻:社交媒體搜尋
想像你在 LinkedIn 上搜尋某人。首先,你會查看你的 直接聯繫人(距離為 1)。如果找不到,你再查看 聯繫人的聯繫人(距離為 2)。這就是先「廣泛」地搜尋,再深入探索。
典型應用:最短路徑
由於 BFS 會優先探索鄰近的節點,它是尋找 無權圖(unweighted graph)(即每條路長度都一樣的圖)中 最短路徑 的絕佳工具。它能保證當你找到目標時,所經過的邊數是最少的。
重點速記:BFS
- 資料結構: 使用 佇列(Queue)。
- 搜尋風格: 廣闊/寬度。
- 最佳用途: 尋找 最短路徑。
2. 深度優先搜尋(Depth-First Search,簡稱 DFS)
如果說 BFS 像漣漪,那麼 深度優先搜尋 就好比一個在黑暗洞穴中探險的探險家。你會選擇一條路一直走到底,直到遇到死胡同,然後 回溯(backtrack) 到上一個分岔路口,再嘗試另一條路。
「深入探索」策略
DFS 會在移動到下一條分支前,徹底探索當前的一條分支。為了管理此過程,DFS 使用 堆疊(Stack) 資料結構(後進先出,Last-In, First-Out)或 遞迴(Recursion)。
步驟詳解:
1. 選擇一個起始節點,並將其標記為 已訪問(visited)。
2. 移動到一個 尚未訪問的相鄰鄰居。
3. 重複步驟 2,直到到達一個沒有未訪問鄰居的節點(死胡同)。
4. 回溯(Backtrack) 到前一個節點,並檢查是否有其他未訪問的鄰居。
5. 當你回溯到起點且所有節點都已訪問完畢時,過程結束。
現實生活中的比喻:走出迷宮
AQA 課程大綱中提到的 走迷宮 是 DFS 最經典的應用。你在走廊裡一直往前走直到撞牆,然後回頭嘗試剛才經過的分岔路口。你不會同時嘗試所有的走廊,而是先走完一條路。
典型應用:迷宮求解與遊戲邏輯
DFS 非常適合用於 迷宮導航 或那些需要判斷長路徑盡頭是否有解的謎題。它比 BFS 使用更少的記憶體,因為它只需要記錄當前路徑上的節點。
重點速記:DFS
- 資料結構: 使用 堆疊(Stack)(或遞迴)。
- 搜尋風格: 深度。
- 最佳用途: 走迷宮。
比較 BFS 與 DFS
考試中很常要求你在兩者之間做出選擇。以下是一個記住兩者區別的簡單方法:
記憶小技巧:字母法
- BFS = Breadth(廣度,向「寬」處搜尋)
- DFS = Depth(深度,向「深」處搜尋)
常見陷阱:
- 忘了標記節點: 如果你不將節點標記為「已訪問」,電腦可能會繞圈圈陷入死循環(無限迴圈)!
- 佇列 vs. 堆疊: 學生常會搞混這兩個。記住:BFS 用 Queue(排隊等候以便進行廣度擴張),DFS 用 Stack(把路徑堆疊起來以便深入探索)。
總結
圖遍歷 是許多複雜演算法的基礎。請為你的 AQA 考試記住這兩大重點:
1. 廣度優先搜尋 (BFS) 使用 佇列 (Queue),透過優先檢查所有鄰居來尋找 無權圖中的最短路徑。
2. 深度優先搜尋 (DFS) 使用 堆疊 (Stack),將路徑探索到底,是 迷宮導航 的經典方法。
如果剛開始追蹤這些步驟覺得很慢,別擔心。拿張紙和筆,畫幾個節點,試著用佇列或堆疊實際「走」一遍。你很快就會領悟其中的竅門!