算法筆記——DFS深度優先搜索

DFS深度優先搜索

1、理解

現在我們先想象以第一視角處於一個巨大的迷宮中(如下圖所示),沒有任何輔助,也沒有什麼上帝視角,假設迷宮只有一個入口和一個出口,那麼如何才能一定走得出去?有個方法,只沿着右手邊的牆走。遇到岔路口,選擇其中一個路口繼續前進,可以理解爲以深度作爲前進的關鍵詞,不碰到死衚衕就不回頭,因此把這種搜索的方式成爲深度優先搜索(Depth First Search,DFS)
從迷宮的例子可以注意到,深度優先搜索是一種枚舉完所有完整路徑以遍歷所有情況的搜索方法

DFS迷宮示意圖
在上面的DFS迷宮中,整個DFS過程訪問結點的順序是ABDHIJEKLMCFG。在這個過程中,每一小步都可以作爲進棧出棧來表示。因此,在分析問題時,可以先得到分岔和死衚衕,再定義一個棧,以深度爲關鍵詞訪問這些關鍵詞和死衚衕,並將它們入棧,而當離開這些岔道口和死衚衕時,將它們出棧。這聽起來很容易,但是實現起來並不輕鬆,一個比較方便的方法就是使用遞歸。

2、一個典型例子:Fibonacci數列

求解的Fibonacci數列,F(0)=1, F(1)=1, F(n)=F(n-1)+F(n-2) (n≥2)
這個例子中可以將F(n)看成分叉,把F(n-1)和F(n-2)看做其下的兩個岔路口,依次遞推,直到遇到死衚衕F(0)和 F(1)。

3、烤雞例題的DFS解法

使用遞歸可以很好的實現DFS,另外在烤雞問題中介紹了直接使用循環,暴力枚舉實現,其本質就是出棧和入棧的操作,使用遞歸是一種較爲方便的實現DFS的方法,在使用遞歸時,系統會調用一個叫系統棧的東西來存放每一層的狀態。

4、根據兩個例子嘗試理解貪心算法和深度優先算法的區別

淘淘摘蘋果的例題和揹包問題來說:
揹包問題
前者已知所有蘋果的高度,身高限制,只需要考慮摘不同高度的蘋果所消耗的體力不同,而後者揹包問題既要考慮到物品的價值,也好考慮到物品佔據揹包的容量;
前者的未知屬性主要集中在不知道先後摘哪些蘋果,,未知屬性只有一種,而後者揹包問題的價值和容量兩個屬性都綁定在物品上,也就是說選擇一個物品就相當於選擇了兩個屬性,兩個變量,前者選擇蘋果只是選擇了一個變量(消耗的體力)
貪心算法的關鍵一點就是可以用數學歸納法證明出局部最優就是全局最優,而後者DFS似乎不可以,所以可以考慮暴力枚舉出所有情況,即使用深度優先搜索的方式求解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章