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