最近做了不少的搜索題,時而用到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也需要高效的剪枝操作。