廣度優先搜尋

2022-09-15 09:45:11 字數 2462 閱讀 6739

下面我們來來bfs演算法策略:

比如:我們要從雙子峰---->金門大橋,最短路徑如何?

我們利用廣度優先搜尋來一步步求解,注意廣度優先搜尋在於的關鍵在於「廣」,也就是說以雙子峰為起點,我們要盡可能的多比較與之相鄰的周邊路徑,從其中選取一條最優路徑。

第一步:

我們沿著兩個箭頭方向路徑探索到a點和b點後,發現並沒有到達想要去的地方,於是我繼續往下探索。

同樣,我們發現還沒有到達目的地,繼續往下探索。

到達這一步後,我們發現其中有一條路徑已經到達金門大橋,而其他兩條路徑僅僅到達c點。因此,我們尋找到的最短路徑為:雙子峰->a->c->金門大橋。

所以,由上我們可以知道,廣度優先搜尋其實就是用來探索最短路徑的一種方式。

根據上面例項,我們想要尋找一條到某地的最短路徑,需要一下兩個步驟:

(1)使用圖來建立問題模型。

(2)使用廣度優先搜尋解決問題。

利用廣度優先搜尋,我們可以回答兩個問題:

1.從節點a出發,有前往b節點的路徑嗎?

2.從節點a出發,前往b節點哪條路徑最短?

首先,我們來看看如何構建一張圖。

這裡我們要使用一種能夠表示對映關係的資料結構---雜湊表。至於什麼是雜湊表,這裡就不再贅述。

例如:

graph = {}

grapu['you'] = ['alice','bob','mar','rain','cat']

這裡的「you」被對映到乙個陣列。在'you'的這個陣列裡面,包含所有與你相鄰的元素。

有了以上方式,我們就可以構建一張更大圖。

首先,建立乙個雙端佇列,將需要查詢的壓入佇列中。

from collections import deque

def person_is_seller(name):

return name[-1] == 'm'  #如果這個名字是以m結尾,則是

graph = {}

grapu['you'] = ['alice','bob','mar','rain','cat']

search_queue = deque()  #建立乙個佇列

search_queue += graph['you'] #將you壓入佇列

while search_queue:  #只要佇列不為空

person = search_queue.popleft()  #取出左邊第乙個人

if person_is_seller(person):  #檢查這個人是否為芒果商

print person += ' is a mango seller! '

return true

else:

search_queue += graph[person]  #將這個人的朋友加入佇列

return false  #沒有芒果商  

但是,上面演算法有乙個明顯的問題,如果你的朋友alice和bob都有這乙個好友,那麼在查詢的過程中就會陷入迴圈狀態。要解決這個問題,我們可以設定乙個列表,來標記那些已經被查詢過的人。因此,最終**如下:

def search(name):

search_queue = deque()  #建立乙個佇列

search_queue += graph[name] #將需要查詢的壓入佇列

searcher =  # 用於記錄已經查詢過的

while search_queue:  #只要佇列不為空

person = search_queue.popleft()  #取出左邊第乙個人

if not person in searched:   #當這個人不在searched中才繼續往下查詢

if person_is_seller(person):  #檢查這個人是否為芒果商

print person += ' is a mango seller! '

return true

else:

search_queue += graph[person]  #將這個人的朋友加入佇列

return false  #沒有芒果商 

首先沿著每條邊進行查詢,如果邊數為n,查詢效率為o(v)

再次,我們在每次查詢過程中需要對已經搜尋的列表進行二次判斷,判斷所需時間為p(n) 

因此,廣度優先搜尋總的查詢效率為o(v+n)

搜尋 廣度優先搜尋

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