一、前言
我們首次接觸 bfs 和 dfs 時,應該是在資料結構課上講的 「圖的遍歷」。還有就是刷題的時候,遍歷二叉樹我們會經常用到bfs和dfs。它們的實現都很簡單,這裡我就不哆嗦去貼**了。
想看**的可以看《劍指offer(三十八):二叉樹的深度》這個題目就可以利用bfs和dfs進行求解。那麼,這兩者「遍歷」 的序列到底有何差別?
本篇文章就單純來講講它們的區別和各自的應用,不會涉及任何**。我們以「圖的遍歷」為例,進行說明。
二、區別
廣度優先搜尋演算法(breadth-first-search,縮寫為 bfs),是一種利用佇列實現的搜尋演算法。簡單來說,其搜尋過程和 「湖面丟進一塊石頭激起層層漣漪」 類似。
深度優先搜尋演算法(depth-first-search,縮寫為 dfs),是一種利用遞迴實現的搜尋演算法。簡單來說,其搜尋過程和 「不撞南牆不回頭」 類似。
bfs 的重點在於佇列,而 dfs 的重點在於遞迴。這是它們的本質區別。
舉個典型例子,如下圖,灰色代表牆壁,綠色代表起點,紅色代表終點,規定每次只能走一步,且只能往下或右走。求一條綠色到紅色的最短路徑。
演算法基礎:bfs和dfs的直觀解釋
對於上面的問題,bfs 和 dfs 都可以求出結果,它們的區別就是在複雜度上存在差異。我可以先告訴你,該題 bfs 是較佳演算法。
演算法基礎:bfs和dfs的直觀解釋
如上圖所示,從起點出發,對於每次出佇列的點,都要遍歷其四周的點。所以說 bfs 的搜尋過程和 「湖面丟進一塊石頭激起層層漣漪」 很相似,此即 「廣度優先搜尋演算法」 中「廣度」的由來。
我認為比較適合求最短路徑,因為他是寬度搜尋,一層層搜。我認為就是先搜距離唯一的所有點,判斷是否為目標點,再搜距離為二的點,判斷,直到搜到目標點為止。此時距離為最短距離。
演算法基礎:bfs和dfs的直觀解釋
如上圖所示,從起點出發,先把乙個方向的點都遍歷完才會改變方向… 所以說,dfs 的搜尋過程和 「不撞南牆不回頭」 很相似,此即 「深度優先搜尋演算法」 中「深度」的由來。
三、總結
現在,你不妨對照著圖,再去看看你列印出的遍歷序列,是不是一目了然呢?
最後再說下它們的應用方向。
演算法基礎 BFS和DFS的直觀解釋
我們首次接觸 bfs 和 dfs 時,應該是在資料結構課上講的 圖的遍歷 還有就是刷題的時候,遍歷二叉樹我們會經常用到bfs和dfs。它們的實現都很簡單,這裡我就不哆嗦去貼 了。bfs和dfs是圖的兩種遍歷方式,是最簡單的圖搜尋演算法。bfs和dfs有幾種實現方式,比如 1 使用佇列queue實現圖...
演算法基礎 BFS和DFS的直觀解釋
我們首次接觸 bfs 和 dfs 時,應該是在資料結構課上講的 圖的遍歷 還有就是刷題的時候,遍歷二叉樹我們會經常用到bfs和dfs。它們的實現都很簡單,這裡我就不哆嗦去貼 了。想看 的可以看 劍指offer 三十八 二叉樹的深度 這個題目就可以利用bfs和dfs進行求解。那麼,這兩者 遍歷 的序列...
dfs和bfs的區別
詳見 部落格 回溯法是一種搜尋法,按條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法 例如這張圖,從1開始到2,之後到5,5不能再走了,退回2,到6,退回2退回1,到3,一直進行 void dfs int deep 這裡可能...