淺談迭代加深
本篇隨筆簡單講解一下算法競賽中搜索算法中的迭代加深DFS。
為什么需要迭代加深
先來上發講解圖:
在學習迭代加深深搜之前,我們先簡單回顧一下深搜。深搜的本質是對圖的深度優先遍歷。也就是“先往深了走,走完了沒找到就換條路繼續走”。對於那種無法一眼看出來是圖論的問題,我們需要先把問題給定的條件抽象為一棵“搜索樹”,然后在抽象出來的搜索樹上進行深搜,解決問題。
假設上圖就是我們針對某一個問題所抽象出來的搜索樹。我們給定答案節點是4號節點。
那么,根據深搜的定義,我們進行算法的順序是1-2-5-10-11-6-12-13-3-7-14-15-16-17-8-4-9.
我們發現,直到最后兩步才找到4.
效率貌似很慢的樣子。
為什么呢?
這是深搜本身的性質決定的,它的搜索順序就是這樣,這個算法不能“千變萬化”,根據你問題的答案位置調整順序,迭代加深也不行(你在想peach)。
如果你說,為什么不用廣搜?
剛剛已經說過了,你設計的算法是成型投產的,你不可能針對一組數據,腦算出它的答案地點,然后再重新寫程序吧?
所以,當我們設計出一款深搜程序,又不想因為被出題人特殊構造數據卡掉的時候,也許我們需要迭代加深。
迭代加深的概念
迭代加深的過程,就是每次對搜索的深度進行一個限制,如果在當前限定下搜不到答案,就把深度限制增加,然后重新進行一次搜索。
比如,對於剛剛的搜索樹。
假如限制是1,不行。
限制是2,搜到,結束。
假設答案是9號點的話,就再限制3,搜到,結束。
但是要提及的是,我們的搜索方式並不是擴展,而是迭代。
也就是說,限制是1,我們搜了1號點,沒搜到答案。
限制換成2的時候,我們就需要重新從1號點開搜,因為如果變成在原有基礎上擴展的話,就變成廣搜了。雖然沒必要,但是對不起,人家算法就是這么設計的,你學就得了。
所以,我們看得出來,這是一個低效率的算法,他的時間復雜度是呈指數級增長的。所以,它的試用條件是:
當搜索樹非常深,但是我們能確定答案一定在淺層節點時,就可以使用迭代加深DFS。