下面我們來來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是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...