最近做了不少的搜尋題,時而用到dfs時而用到bfs,這裡對兩種搜尋方法做乙個總結。
廣度優先搜尋演算法(breadth-first-search,縮寫為 bfs),是一種利用佇列實現的搜尋演算法。簡單來說,其搜尋過程和 「湖面丟進一塊石頭激起層層漣漪」 類似。
先搜尋鄰居,搜完鄰居再搜鄰居的鄰居。
其中倆個思想: 1 .佇列不為空則迴圈
2.將未訪問的鄰接點壓入佇列後面,然後從前面取出並訪問(這樣就做到了廣度優先)
圖的解釋:
1 2
3 4 5 6
這個是二叉樹的例子,這裡如果是廣度優先的話,訪問的順序依次是0123456.
深度優先搜尋演算法(depth-first-search,縮寫為 dfs),是一種利用遞迴實現的搜尋演算法。簡單來說,其搜尋過程和 「不撞南牆不回頭」 類似。
從起點出發,先把乙個方向的點都遍歷完才會改變方向......
先找到出發點,依次對找其所有未訪問的鄰接點做dfs(仔細想想,這裡,未訪問完鄰居繼續做dfs,這樣就做到了深度優先)
這裡貼乙個樹的深度優先搜尋樹的例子
這個樹很簡單:
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中剪枝的一篇說明部落格
深搜DFS和廣搜BFS
一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著是用廣...
廣搜與深搜的區別
原 一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著若...
深搜與廣搜
深搜是一種一條路走到黑,碰壁就倒退的演算法。運用遞迴思想,如果到了不符合條件的節點就撤回一步,然後再選擇另一條路走下去。如果這個節點的所有路徑都走完了,再撤回一步。最簡單的模板 int x 4 int y 4 上下左右四個方向走。也可以八個方向,這裡我就不寫了。void dfs int fx,int...