廣度優先搜尋

2021-10-19 12:56:50 字數 1569 閱讀 1993

廣度優先搜尋是乙個按順序依次嘗試可能的搜尋選項的演算法。換句話說,它每次都會選擇嘗試最先發現的但還沒有嘗試過的選項。

可以想象乙個列表(更具體地說,是乙個佇列),上面存著所有已知的但還沒有嘗試過的狀態(選項)。每一步,演算法都會選擇從當前佇列的第乙個狀態開始進行嘗試。當發現新的可能性時,就將其加到佇列的最後,以確保演算法在嘗試完所有先前已經發現的可能狀態後才會去嘗試這個新發現的狀態。

乙個圖是一種由點和邊組成的資料結構。如果兩個點由一條邊相連,我們就可以說這兩個點是相鄰的。

kingdom highway map這個圖里的每個點代表乙個城市,而每條邊則代表一條連線兩個城市的高速公路。罪犯們一般都傾向於逃離他們所在城市,而你則需要找出他們最可能逃到哪些相鄰的城市。

搜尋 kingdom highway map 是乙個經典的圖上搜尋問題。 我們搜尋的狀態是圖上的點,也就是地圖上的城市。假設現在有人在 a 城市犯了罪,而你的目標是找到罪犯在哪。

如果每個點都有很多相鄰的點的話,維護這個佇列就會占用大量的記憶體空間。在搜尋乙個大規模的問題時,這個記憶體需求會變得相當巨大。

在廣度優先搜尋的每一步,我們都需要先看看當前的點是不是我們的最終目標。

在這個具體的例子當中,我們需要把當前點對應的城市仔細搜查一遍,如果當前的點還不是我們想找的目標,就把與它相鄰的點中還未被檢查過的點(也就是我們之前從來沒有加到列表中的點)加到列表中。如此一來,我們可以避免重複新增已經檢查過的點,以及雖然還未檢查過但已經在列表裡的點。在這個具體的例子中,檢查過城市 b 後,我們將不會重複新增城市 a (雖然它和 b 城市是相鄰的,但我們已經檢查過它了)。

請注意,如果我們想要檢查乙個點在之前是否已經被新增過,將需要更多的記憶體,因為我們需要記錄下所有已經被加入過列表中的點。不過這樣做會給我們帶來巨大的好處——可以避免重複多次檢查同乙個點重申一遍,仔細地記錄下已經檢查過的點會給你帶來巨大的好處。

在這個具體的例子中,我們在 h 城市找到了要找的罪犯。 至此我們可以在 h 城市逮捕他,結束搜尋。

在搜尋問題中,如果任意相鄰的兩個點之間移動的代價 (例如所需的時間、體力,等等)是相等的,那麼廣度優先搜尋可以保證找到一條花費最小代價的路徑。這是因為它在檢查完所有離起點距離 x 步的點後,才會開始檢查那些更遠的,例如離起點距離 x + 1 步的點。

搜尋 廣度優先搜尋

廣度優先搜尋一層一層地進行遍歷,每層遍歷都是以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。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是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...