dfs簡單總結

介紹:dfs中文名“先深搜索”,說得通俗點就是一搜到底,“不撞南牆不回頭”


如上圖,dfs搜索次序爲1->2->3到頭之後,回到2,然後到4,此時有兩個方向可走,一個是3,一個是5,因爲3已搜過,那麼只有搜5了,此時所有節點全部遍歷完。

dfs一般用遞歸來實現,

格式如下:

dfs(Px)

{

結束條件;

For(Pn)

{

           如滿足某些條件(如有線段相連)就dfs(Py);

}

}

應用:

1、因爲dfs一搜到底的特性,當我們需要對一個有一些步驟(每一步可能會有多種做法)的事件作處理時,我們可以在假設步驟做法的情況下,得到一個事件,再判斷事件是否滿足條件,若滿足,那麼就得到了一組步驟做法的解,所有情況都遍歷的情況下,就得到了所有解。(如,在找節點1到節點n之間的通路個數時就可以用這個特性)

2、因爲dfs在“撞牆”之後會回頭,也就是會回溯,當回溯時也就可以把“撞牆”時獲得的一些信息返回過來。(如,在兩人博弈問題,暴力搜索時,用的就是這個特性)

優化:

dfs可以說是一種相當暴力的方法,所以說,時間複雜度在一般情況下不會低,所以就必須學會優化。剪枝是一種優化的方法,它是把那種絕對不滿足條件的可能性去掉(不去遍歷它),如最開始那幅圖,若規定通路中不能有節點3,那麼碰到節點3,就跳過,不去dfs,或者把節點3當做“牆”,碰到節點3就相當於“撞牆”了。步驟限制法,當你知道你要找的解的步驟數一定小於某個值時,那麼步驟數一旦達到那個值就“撞牆了”,只能回溯了。


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