廣度優先搜尋

2022-06-18 19:42:12 字數 1633 閱讀 1176

即bfs

bfs 的核心思想就是把一些問題抽象成圖,從乙個點開始,向四周開始擴散。一般來說,我們寫 bfs 演算法都是用「佇列」這種資料結構,每次將乙個節點周圍的所有節點加入佇列。

bfs 相對 dfs 的最主要的區別是:bfs 找到的路徑一定是最短的,但代價就是空間複雜度比 dfs 大很多

框架bfs 出現的常見場景:讓你在一幅「圖」中找到從起點start到終點target的最近距離,這個例子聽起來很枯燥,但是 bfs 演算法問題其實都是在幹這個事兒。

這個廣義的描述可以有各種變體,比如走迷宮,有的格仔是圍牆不能走,從起點到終點的最短距離是多少?如果這個迷宮帶「傳送門」可以瞬間傳送呢?再比如說兩個單詞,要求你通過某些替換,把其中乙個變成另乙個,每次只能替換乙個字元,最少要替換幾次?

本質上就是一幅「圖」,讓你從乙個起點,走到終點,問最短路徑。這就是 bfs 的本質。

// 計算從起點 start 到終點 target 的最近距離

int bfs(node start, node target)

}/* 劃重點:更新步數在這裡 */

step++;

}}

bfs的本質是在「圖」中的擴散式搜尋,每一步都會把當前佇列中的元素 的 周圍的元素都收入佇列,從搜尋的大框架來說,從最開始只往佇列中加入乙個元素起,每一步的操作都是依次把佇列中的元素彈出(返回並刪除該元素),對該元素進行比對(若是target則返回),若不是target則把這個元素的相鄰元素全部壓入佇列之中(事實上並不是全部,為了避免重複操作,必須在這一步把已操作過的元素略過)。

一般採用佇列進行裝載,採用hashset來記錄是否訪問過。

正如上面所說,bfs解決的是從起點到終點的最短路徑,那麼使用bfs前一定要先想明白起點和終點是什麼。

例項1:

leet111.二叉樹的最小深度

本題很簡單,起點是root,終點是葉子結點。

葉子節點的判斷條件就是左右節點都是null,這裡還有個點就是二叉樹是不能走回頭路的,也就是說不會出現已訪問過的元素,那麼就無需設定visited。

class solution

int step=1;

queueq=new linkedlist();

q.offer(root);

while(!q.isempty())

setvisited=new hashset<>();

q.offer("0000");

visited.add("0000");

int step=0;

while(!q.isempty()){

int sz=q.size();

for(int i=0;ibfs 的邏輯,depth每增加一次,佇列中的所有節點都向前邁一步,這保證了第一次到達終點的時候,走的步數是最少的。而dfs 實際上是靠遞迴的堆疊記錄走過的路徑,你要找到最短路徑,肯定得把二叉樹中所有樹杈都探索完才能對比出最短的路徑有多長。bfs 借助佇列做到一次一步「齊頭並進」,是可以在不遍歷完整棵樹的條件下找到最短距離的。形象點說,dfs 是線,bfs 是面;dfs 是單打獨鬥,bfs 是集體行動。bfs 可以找到最短距離,但是空間複雜度高,而 dfs 的空間複雜度較低。

搜尋 廣度優先搜尋

廣度優先搜尋一層一層地進行遍歷,每層遍歷都是以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。class solution,int shortestpathbinarymatrix vectorint grid length return 1 cl...

廣度優先搜尋

include include include include using namespace std struct node 圖頂點結構定義 typedef struct node graph 圖形的結構新型態 struct node head 9 圖形頂點陣列 int visited 9 遍歷標...

廣度優先搜尋

廣度優先搜尋詳解 1.也稱寬度優先搜尋,顧名思義,就是將一棵樹一層一層往下搜。演算法首先搜尋和s距離為k的所有頂點,然後再去搜尋和s距離為k l的其他頂點。bfs是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...