1. 程式人生 > 其它 >dfs之迭代加深

dfs之迭代加深

為什麼要用迭代加深

\(dfs\) 每次會選擇搜尋樹的一個分支,不斷深入,直到達到遞迴邊界條件;但這種搜尋策略帶有一定的缺陷性:

如果搜尋樹的某一個分支中的節點個數特別多,但是答案並不在這棵子樹裡面,那麼我們就需要花費很多的無用時間去搜索這棵子樹。

如圖:

在這張圖中,假設我們的目標節點是標五角星的節點,我們會首先搜尋框框中的子樹,然後才會搜到目標節點。這會浪費我們很多時間。

因此,我們需要想出一種思路去優化這種搜尋策略。

什麼是迭代加深

還是那上面那個圖來舉例子。如果我們按層搜尋,那麼只要搜尋三層就可以搜尋到當前節點了,這樣可以節省我們很多時間。

所以,可以規定搜尋最大層數\(max\)\(depth\)

,只要搜尋到\(max\)\(depth\)仍然無解,那麼我們就擴充套件\(max\)_\(depth\), 擴大深度繼續搜尋目標。

誤區解釋

  • Q : 我們每次擴充套件深度的時候,會重複搜尋\(maxdepth - 1\)\(1\) 層之間的節點,這樣就不會浪費時間了嗎??

  • A : 雖然深度限制為 \(maxdepth\) 時,會重複搜尋 \(1\) - \(maxdepth - 1\)之間的節點,但是當搜尋樹節點分支數目較多時,隨著層數的深入,每層的節點個數會呈指數級增長,這點搜尋重複和深層節點的搜尋冗餘相比實在是太少了。

迭代加深經典例題

Acwing 170. 加成序列 (來源:《演算法競賽進階指南》