一文弄懂搜尋演算法中的DFS和BFS

2021-10-04 05:20:59 字數 1904 閱讀 8384

有一位小夥伴問我,迷宮問題怎麼解決,我說dfs或者bfs,然後,ta說,哦哦,這我知道,就是圖裡面的演算法嘛,但,這是個迷宮,難道我要把這個二維矩陣變成圖嘛?

我:當場去世。。。

於是我開啟了我的長篇大論。。。

希望大家有所收穫。

首先,回答一下那位小夥伴的問題,這個演算法確實屬於圖裡面的演算法,但並不是說是專門針對圖的演算法,它在演算法領域應用非常廣泛,可以說是一種不可缺少的思想。

bfs:寬度優先搜尋演算法(又稱廣度優先搜尋)是最簡便的圖的搜尋演算法之一,這一演算法也是很多重要的圖的演算法的原型。dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和寬度優先搜尋類似的思想。其別名又叫bfs,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜尋整張圖,直到找到結果為止。

說實話,我第一次看沒看懂,確實比較官方,我們可以用我們的思維去簡單的理解一下:

說再多不如看張圖,看圖吧:

如果你還對這兩種方式不理解,你可以看一下圖的dfs和bfs。

這兩種演算法的不同主要在於優先順序的不同,所以實現方式是很相似的。

這兩種演算法都可以使用的遞迴的方式,其中dfs還可以用棧來實現,bfs還可以用佇列實現。

具體的實現,可以參考 :島嶼的最大面積–dfs(附搜尋全家桶)

dfs和bfs用遞迴實現的思路:

dfs用棧實現的思路:

bfs用佇列實現的思路:

特別的:

其實,大部分問題都是既可以用bfs,也可以用dfs的,但是這兩種演算法面對不同的問題,解決效率並不一樣。

list item

bfs:

dfs:

我的觀點就是:無特殊情況,dfs就用遞迴實現,bfs就用佇列實現。

我們看一下兩種實現方式對處理問題帶來的不同:

第一步,確定什麼問題可以用這兩種演算法解決:(可別說只針對圖了啊)

第二步,確定使用的演算法和實現形式,具體看上文。

第三步,根據題目的需求,確定搜尋失敗後是否需要還原狀態,求值問題是否需要更新值。

第四步,設計針對性的演算法。

注意事項:

除錯小技巧:通過輸出關鍵操作的值,來確定程式執行的順序,確定出錯原因。

我們設計演算法,不是為了單純ac問題,而是,追求極致,比如,這個:

優化時間的思路:

優化空間的思路:

這兩種演算法的鼻祖就是搜尋演算法,搜尋演算法的核心就是遍歷到所有可能的情況,所以,常見的暴力列舉也是搜尋演算法的一種,所以我們在採用這兩種演算法的時候,思路就已經是在遍歷所有可能的情況了,但是在這其中,可以借助貪心的思維去優化,做到不必要遍歷每種情況。

演算法,還是要使用,所有,多練習經典的題目吧!!!

下面是一些比較經典的題目,你也可以嘗試去做n皇后問題,迷宮問題。

牌型種數問題

方格填數

路徑之謎

單詞搜尋

最後,多練多收穫!!!

棧和佇列互相實現,一文弄懂它們的關係

棧和佇列是比較基礎的資料結構。無論在工作中,還是在面試中,棧和佇列都用的比較多。在計算機的世界,你會看到佇列和棧,無處不在。棧 乙個先進後出的資料結構 佇列 乙個先進先出的資料結構 棧和佇列這兩種資料結構,同時也存在某種聯絡。用棧可以實現佇列,用佇列也可以實現棧。海邊風景不錯,欣賞一下風景,下面開始...

分享兩個常見的搜尋演算法 BFS和DFS

摘要 本文為大家分享兩個常見的搜尋演算法 bfs和dfs。本次分享兩個常見的搜尋演算法 1.bfs 即廣度優先搜尋 2.dfs 即深度優先搜尋 給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四...

小白 關於DFS深度優先搜尋演算法的一些問題

本人小白,這是該賬號的第一篇文章,開場白到此。最近在看 啊哈 演算法 這本書,在第4章中介紹了dfs演算法 dfs演算法框架如下 void dfs int step 判斷邊界 for int i 0 i n i 迴圈嘗試每種可能 book i 1 嘗試下一步dfs step 1 book i 0 r...