dfs之迭代加深
阿新 • • 發佈:2022-02-04
為什麼要用迭代加深
\(dfs\) 每次會選擇搜尋樹的一個分支,不斷深入,直到達到遞迴邊界條件;但這種搜尋策略帶有一定的缺陷性:
如果搜尋樹的某一個分支中的節點個數特別多,但是答案並不在這棵子樹裡面,那麼我們就需要花費很多的無用時間去搜索這棵子樹。
如圖:
在這張圖中,假設我們的目標節點是標五角星的節點,我們會首先搜尋框框中的子樹,然後才會搜到目標節點。這會浪費我們很多時間。
因此,我們需要想出一種思路去優化這種搜尋策略。
什麼是迭代加深
還是那上面那個圖來舉例子。如果我們按層搜尋,那麼只要搜尋三層就可以搜尋到當前節點了,這樣可以節省我們很多時間。
所以,可以規定搜尋最大層數\(max\)\(depth\) ,只要搜尋到\(max\)\(depth\)仍然無解,那麼我們就擴充套件\(max\)_\(depth\), 擴大深度繼續搜尋目標。
誤區解釋
-
Q : 我們每次擴充套件深度的時候,會重複搜尋\(maxdepth - 1\) 到 \(1\) 層之間的節點,這樣就不會浪費時間了嗎??
-
A : 雖然深度限制為 \(maxdepth\) 時,會重複搜尋 \(1\) - \(maxdepth - 1\)之間的節點,但是當搜尋樹節點分支數目較多時,隨著層數的深入,每層的節點個數會呈指數級增長,這點搜尋重複和深層節點的搜尋冗餘相比實在是太少了。
迭代加深經典例題
Acwing 170. 加成序列 (來源:《演算法競賽進階指南》