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 Anthony DELANOIX on Unsplash
Read More

Union Find

Union Find data structure 又稱 disjoint set data structure。它是一個資料結構,用來儲存一堆 disjoint set。它提供兩個操作,一個是用來合併兩個 sets,另一個是用來尋找給定元素的 set。
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