Depth First Search (DFS)

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

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

遞迴版本

演算法

遞迴版的 DFS 演算法需要一個資料結構叫 visited,它用來記錄每個點是否已經探索過。遞迴版的 DFS 演算法就是,對每一個點的相鄰點做一次 DFS。

Algorithm DFS(v, visited) {
    visited[v] := true;
    for all edges (v, w) {
        if !visited[w] {
            DFS(w, visited);
        }
    }
}

時間與空間複雜度

DFS 會掃描探索每一個點一次,此時間複雜度是 O(V)。然後,它會掃描每個點的所有相鄰點一次,此時間複雜度是 O(E)。所以,DFS 的總時間複雜度是 O(V + E)。

DFS 需要一個資料結構來記錄點是否已經探索過,所以空間複雜度是 O(V)。在遞迴呼叫時,程式會將參數與返回位址推進 stack 裡。在最壞的情況下,那會是從第一個點一直遞迴地探索到最後一個點,所以空間複雜度是 O(V)。所以,DFS 的總空間複雜度是 O(V)。

非遞迴版本

演算法

非遞迴版的 DFS 演算法需要兩個資料結構。一個叫 visited,用來記錄每個點是否已經探索過,而另外一個是 stack。當探索到某個點時,它會將相連點一一推進 stack 裡。然後,每一次都會從 stack 中取出最後推入的點來探索。

Algorithm DFS(v) {
    stack := Stack();
    stack.push(v);
    while stack.isNotEmpty {
        u := stack.pop();
        if !visited[u] {
            visited[u] := true;
            for all edges (u, w) {
                stack.push(w);
            }
        }
    }
}

時間與空間複雜度

DFS 會掃描探索每一個點一次,此時間複雜度是 O(V)。然後,它會掃描每個點的所有相鄰點一次,此時間複雜度是 O(E)。所以,DFS 的總時間複雜度是 O(V + E)。

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

範例

下面的範例是遞迴版的 DFS 演算法。 它顯示在每一步驟時,visited 內部的變化。

參考

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

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

You May Also Like
Photo by Pedro Lastra on Unsplash
Read More

Breadth First Search (BFS)

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