1. 程式人生 > >對於深度優先搜尋演算法的理解

對於深度優先搜尋演算法的理解

1. dfs嘗試走遍可能的路線

所以一看到題目確定要使用dfs來解決的時候首先要在紙上畫出簡單的例子的樹,然後進行簡單的模擬呼叫dfs的過程,通過這顆簡單的樹可以清楚地瞭解呼叫的情況,從簡單的例子和自己的總結中看出有多少個平行的狀態,並且每個平行狀態退回來需要怎麼樣處理
其中確定了使用dfs處理之後最核心的就是如何處理平行狀態,有的題目可能涉及兩個平行狀態,有的題目可能涉及多個平行狀態,像數獨就存在多個平行的狀態
退回來執行狀態說明要嘗試另外一可能的情況

2.其中在呼叫dfs的過程中可能涉及要記錄其中的過程,所以我們需要對退回來的狀態非常地熟悉,才能對退回來之後的狀態進行處理
其中我們經常使用到List,HashMap,StringBuilder,陣列這些資料結構來記錄其中動態變化的情況


這就涉及到了呼叫完退回來之後需不需要進行回溯的問題,假如進入下一個平行狀態的時候,上一個平行狀態對其有影響那麼就需要進行回溯,像陣列,List這些引用型的變數那麼可能需要回溯,但是是否需回溯需要看具體的情況來決定


通常在記錄結果的時候在退回到兩個平行狀態下進行回溯把加入到List或者中的元素給刪除掉,以便下一次找到符合的元素進行加入到這些動態的資料結構中,像持有0.5,1面值的人怎麼樣進行排隊才能夠滿足有足夠的錢找的題目就是經典的例子,一返回到這一層然後就把這一層的加入的元素給刪除掉(每一次呼叫退回去的時候都把原來加入的元素給刪除掉讓動態的資料結構能夠保持正常的元素
所以在回溯的過程我們就可以記錄下其中的中間過程了,加入元素然後刪除元素那麼動態的資料結構裡面儲存的元素就是正確的

3.dfs方法中引數的變化和處理
呼叫dfs的時候要傳入多少個引數需要看具體的情況假如傳入進去的引數不夠可以增加引數可以更方便地進行處理,每一次呼叫,引數都在變化,所以總會達到某一個臨界的狀態,這個時候就需要設計出口來退出這一層的dfs的呼叫