1. 程式人生 > >DFS與BFS的總結

DFS與BFS的總結

BFS與DFS的討論:BFS:這是一種基於佇列這種資料結構的搜尋方式,它的特點是由每一個狀態可以擴展出許多狀態,然後再以此擴充套件,直到找到目標狀態或者佇列中頭尾指標相遇,即佇列中所有狀態都已處理完畢。

DFS:基於遞迴的搜尋方式,它的特點是由一個狀態拓展一個狀態,然後不停拓展,直到找到目標或者無法繼續拓展結束一個狀態的遞迴。

優缺點:BFS:對於解決最短或最少問題特別有效,而且尋找深度小,但缺點是記憶體耗費量大(需要開大量的陣列單元用來儲存狀態)。

        DFS:對於解決遍歷和求所有問題有效,對於問題搜尋深度小的時候處理速度迅速,然而在深度很大的情況下效率不高

總結:不管是BFS還是DFS,它們雖然好用,但由於時間和空間的侷限性,以至於它們只能解決資料量小的問題。

各種搜尋題目歸類:

座標型別搜尋 :這種型別的搜尋題目通常來說簡單的比較簡單,複雜的通常在邊界的處理和情況的討論方面會比較複雜,分析這類問題,我們首先要抓住題目的意思,看具體是怎麼建立座標系(特別重要),然後仔細分析到搜尋的每一個階段是如何通過條件轉移到下一個階段的。確定每一次遞迴(對於DFS)的回溯和深入條件,對於BFS,要注意每一次入隊的條件同時注意判重。要牢牢把握目標狀態是一個什麼狀態,在什麼時候結束搜尋。還有,DFS過程的引數如何設定,是帶引數還是不帶引數,帶的話各個引數一定要保證能完全的表示一個狀態,不會出現一個狀態對應多個引數,而這一點對於BFS來說就稍簡單些,只需要多設定些變數就可以了。

              經典題目:細胞(NDK1435)、Tyvj:乳草的入侵、武士風度的牛

數值型別搜尋:(雖然我也不知道該怎麼叫,就起這個名字吧),這種型別的搜尋就需要仔細分析分析了,一般來說採用DFS,而且它的終止條件一般都是很明顯的,難就難在對於過程的把握,過程的把握類似於座標型別的搜尋(判重、深入、列舉),注意這種型別的搜尋通常還要用到剪枝優化,對於那些明顯不符合要求的特殊狀態我們一定要在之前就去掉它,否則它會像滾雪球一樣越滾越大,浪費我們的時間。

              經典題目:Tyvj:派對;售貨員的難題,以及各種有關題目