深搜(DFS)與廣搜(BFS)區別


最近做了不少的搜索題,時而用到DFS時而用到BFS,這里對兩種搜索方法做一個總結。

 

廣度優先搜索算法(Breadth-First-Search,縮寫為 BFS),是一種利用隊列實現的搜索算法。簡單來說,其搜索過程和 “湖面丟進一塊石頭激起層層漣漪” 類似。

先搜索鄰居,搜完鄰居再搜鄰居的鄰居。

其中倆個思想:   1 .隊列不為空則循環

                           2.將未訪問的鄰接點壓入隊列后面,然后從前面取出並訪問(這樣就做到了廣度優先)

圖的解釋:

                         0

                   1          2

             3        4   5        6

這個是二叉樹的例子,這里如果是廣度優先的話,訪問的順序依次是0123456.

 

 

深度優先搜索算法(Depth-First-Search,縮寫為 DFS),是一種利用遞歸實現的搜索算法。簡單來說,其搜索過程和 “不撞南牆不回頭” 類似。

從起點出發,先把一個方向的點都遍歷完才會改變方向......

 先找到出發點,依次對找其所有未訪問的鄰接點做dfs(仔細想想,這里,未訪問完鄰居繼續做dfs,這樣就做到了深度優先)

 

這里貼一個樹的深度優先搜索樹的例子

這個樹很簡單:

                         0

                   1          2

             3        4   5        6

是一個二叉樹。

如果是深度優先算法來搜,則搜索順序應該為:0134256

 

各自用途

1.BFS是用來搜索最短徑路的解是比較合適的,比如求最少步數的解,最少交換次數的解,因為BFS搜索過程中遇到的解一定是離根最近的,所以遇到一個解,一定就是最優解,此時搜索算法可以終止。這個時候不適宜使用DFS,因為DFS搜索到的解不一定是離根最近的,只有全局搜索完畢,才能從所有解中找出離根的最近的解。(當然這個DFS的不足,可以使用迭代加深搜索ID-DFS去彌補)


2.DFS是空間效率高,DFS不需要保存搜索過程中的狀態,而BFS在搜索過程中需要保存搜索過的狀態,而且一般情況需要一個隊列來記錄。


3.DFS適合搜索全部的解,因為要搜索全部的解,那么BFS搜索過程中,遇到離根最近的解,並沒有什么用,也必須遍歷完整棵搜索樹,DFS搜索也會搜索全部,但是相比DFS不用記錄過多信息,所以搜素全部解的問題,DFS顯然更加合適,一般情況下,DFS也需要高效的剪枝操作。 

 

這里是關於DFS中剪枝的一篇說明博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM