天天看點

對于深度優先搜尋算法的了解

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

是以一看到題目确定要使用dfs來解決的時候首先要在紙上畫出簡單的例子的樹,然後進行簡單的模拟調用dfs的過程,通過這顆簡單的樹可以清楚地了解調用的情況,從簡單的例子和自己的總結中看出有多少個平行的狀态,并且每個平行狀态退回來需要怎麼樣處理

其中确定了使用dfs處理之後最核心的就是如何處理平行狀态,有的題目可能涉及兩個平行狀态,有的題目可能涉及多個平行狀态,像數獨就存在多個平行的狀态

退回來執行狀态說明要嘗試另外一可能的情況

2. 其中在調用dfs的過程中可能涉及要記錄其中的過程,是以我們需要對退回來的狀态非常地熟悉,才能對退回來之後的狀态進行處理

其中我們經常使用到List,HashMap,StringBuilder,數組這些資料結構來記錄其中動态變化的情況

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

通常在記錄結果的時候在退回到兩個平行狀态下進行回溯把加入到List或者中的元素給删除掉,以便下一次找到符合的元素進行加入到這些動态的資料結構中,像持有0.5,1面值的人怎麼樣進行排隊才能夠滿足有足夠的錢找的題目就是經典的例子,一傳回到這一層然後就把這一層的加入的元素給删除掉(每一次調用退回去的時候都把原來加入的元素給删除掉讓動态的資料結構能夠保持正常的元素)

是以在回溯的過程我們就可以記錄下其中的中間過程了,加入元素然後删除元素那麼動态的資料結構裡面儲存的元素就是正确的

3. dfs方法中參數的變化和處理

調用dfs的時候要傳入多少個參數需要看具體的情況假如傳入進去的參數不夠可以增加參數可以更友善地進行處理,每一次調用,參數都在變化,是以總會達到某一個臨界的狀态,這個時候就需要設計出口來退出這一層的dfs的調用