Breadth First Search (BFS)

Photo by Pedro Lastra on Unsplash
Photo by Pedro Lastra on Unsplash
廣度優先搜尋(BFS)演算法是一種圖形搜尋演算法。從給定的一個點開始,它會先探索該點所有的相鄰點。再來,依序探索這些相鄰點的相鄰點。這樣子一層一層地探索下去,直到找到結果,或是探索完所有的點。

廣度優先搜尋(BFS)演算法是一種圖形搜尋演算法。從給定的一個點開始,它會先探索該點所有的相鄰點。再來,依序探索這些相鄰點的相鄰點。這樣子一層一層地探索下去,直到找到結果,或是探索完所有的點。

演算法

BFS 演算法需要兩個資料結構。一個叫 visited,用來記錄點是否已經探索過,而另外一個是 queue。當探索到某個點時,它會將相鄰點一一加入到 queue 裡。然後,每一次都會從 queue 中取出最先加入的點來探索。

Algorithm BFS(v) {
    queue := Queue();
    queue.enqueue(v);
    visited[v] := true;
    while queue.isNotEmpty {
        u := queue.dequeue();
        for all edges (u, w) {
            if !visited[w] {
                queue.add(w);
                visited[w] := true;
            }
        }
    }
}

時間與空間複雜度

BFS 會從 queue 中取出點,而每個點最多只會被加入到 queue 一次,此時間複雜度是 O(V)。然後,它會掃描每個點的所有相鄰點一次,此時間複雜度是 O(E)。所以,BFS 的總時間複雜度是 O(V + E)。

BFS 需要一個資料結構來記錄點是否已經探索過,所以空間是雜度是 O(V)。BFS 還需要一個 queue,而每個點只會被加入一次。在最壞的情況下,除了目前正在探索的點外,所有的點都在 queue,所以空間複雜度是 O(V)。所以,BFS 的總空間複雜度是 O(V)。

範例

下面的範例顯示,在每一個步驟時,queue 和 visited 內部的變化。

參考

  • Ellis Horowitz, Sartaj Sahni, Sanguthevar Rajasekaran, Computer Algorithm.
  • Breadth-first search, Wikipedia.
發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like
Photo by Léonard Cotte on Unsplash
Read More

Depth First Search (DFS)

深度優先搜尋(DFS)演算法是一種圖形搜尋演算法。從給定的一個點開始,它會先探索該點的一個相鄰點。再來,探索該相鄰點的一個相鄰點。這樣子一直探索下去,直到某的點沒有相鄰點時,它就會退回到上一個點,並探索該點的下一個相鄰點。它會一直這樣地探索下去,直到找到結果,或是探索完所有的點。
Read More
Photo by Simon Hermans on Unsplash
Read More

Priority Queue & Heap

Priority queue 是一個很好用的 data structure。它可以在常數時間內提供最大或最小值。在了解它之前,我們要先了解另一個 data structure 叫 heap。因為 priority queue 常常會用 heap 來實作。
Read More
Photo by Folco Masi on Unsplash
Read More

Binary Search Tree

二元搜尋樹(Binary search tree, BST)是一種二元樹(binary tree)。它提供了一些有用操作,包含 search、insert、delete、minimum、maximum、successor 和 predecessor。
Read More
Photo by Anthony DELANOIX on Unsplash
Read More

Union Find

Union Find data structure 又稱 disjoint set data structure。它是一個資料結構,用來儲存一堆 disjoint set。它提供兩個操作,一個是用來合併兩個 sets,另一個是用來尋找給定元素的 set。
Read More