BFS和DFS直觀區別 FLY

2021-09-26 07:31:09 字數 1292 閱讀 9431

一、前言

我們首次接觸 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 這裡可能...