跳至內容

迭代深化深度優先搜索

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

迭代深化深度優先搜索 (iterative deepening depth-first search (IDS or IDDFS)))是對狀態空間的搜索策略。它重複地運行一個有深度限制的深度優先搜索,每次運行結束後,它增加深度并迭代,直到找到目標狀態。

IDDFS 與廣度優先搜索有同樣的時間複雜度,而空間複雜度遠優。

IDDFS 第一次訪問節點的累積順序是廣度優先的。


例子

對於這張圖,若使用標準的深度優先搜索(DFS),則演算法會在B、F、E、A之間無限循環,而永遠不會檢查C和G。

因此,我們可以限制搜索的深度,當達到限制深度時,即使還有未檢查的子節點,也會強制搜索其他待檢查的節點。

具體作法如下:

首先,限制搜索深度為0,此時只會檢查A。

接著,深度增加至1,此時會依序檢查A、B、C、E。

接著,深度增加至2,此時會依序檢查A、B、D、F、C、G、E、F。由於深度限制的關係,演算法得以檢查所有的節點。


值得注意的是,在上述的示例中,F被檢查了兩次。這是因為DFS會優先檢查一條分支上的所有節點,且檢查節點的同時會將其從堆疊(stack)中移除,因此DFS往往不會避開已檢查的節點,但也因此擁有優於廣度優先搜索的空間複雜度。IDDFS保留了這項優點,但又不會卡在環狀結構或過長的分支中而無法搜尋其他分支上的節點。


算法

以下虛擬碼展示了由遞歸地使用限制深度的 DFS (深度優先搜索) 算法來實現的 IDDFS 算法 (叫作 DLS).

procedure IDDFS(root)
    for depth from 0 to ∞
        found ← DLS(root, depth)
        if found ≠ null
            return found

procedure DLS(node, depth)
    if depth = 0 and node is a goal
        return node
    else if depth > 0
        foreach child of node
            found ← DLS(child, depth−1)
            if found ≠ null
                return found
    return null