廣度優先搜尋的一些學習筆記

2021-08-29 12:25:16 字數 1818 閱讀 3062

什麼是圖?

圖由節點和邊組成。乙個節點可能與眾多節點直接相連,這些節點也被稱為鄰居。

圖用於模擬一組連線。

例如從雙子峰到金門大橋的出行路線圖:

由上面這個圖,我們要找出從雙子峰到金門大橋的最短換乘路線,這個問題被稱為最短路徑問題,而解決最短路徑問題的演算法被稱為廣度優先搜尋。

廣度優先搜尋是一種用於圖的查詢演算法。

想要實現廣度優先搜尋首先我們要解決優先順序的實現問題,很顯然,在這裡使用佇列是很明智的選擇。

然後我們需要實現圖,圖由多個節點組成,很顯然,在這裡我們可以使用雜湊表去表示圖的關係,將節點對映到其所有的鄰居。

執行時間

將乙個元素新增到佇列需要的時間是固定的,為o(1),因此對每個元素都這樣做需要的總時間為o(元素個數),在圖裡面從乙個節點到另乙個節點需要的時間是o(邊數)。所以廣度優先搜尋的執行時間為o(元素個數 + 邊數),這通常寫作o(v + e),其中v為頂點數,e為邊數。

樹是一種特殊的圖,其中沒有往後指的邊。**

這裡以經營芒果農場需要將芒果賣給芒果銷售商為例,我們需要通過facebook去查詢芒果銷售商:

# 首先建立表示人際關係的圖  

graph = {}

graph['you'] = ['alice', 'bob', 'claire']

graph['bob'] = ['angel', 'peggy']

graph['alice'] = ['peggy']

graph['claire'] = ['tom', 'jonny']

graph['angel'] =

graph['peggy'] =

graph['tom'] =

graph['jonny'] =

# 然後建立乙個佇列,我們可以使用雙端佇列deque

from collections import deque

def search_mango(name):

search_queue = deque()

# 將『你』的鄰居都加入到這個搜尋佇列中

search_queue += graph['you']

# 建立乙個陣列用於記錄檢查過的人

searched =

# 只要佇列不為空,就取出其中的第乙個人

while search_queue:

person = search_queue.popleft()

# 檢查這個人是否是芒果銷售商,函式person_is_seller可以自己嘗試去實現一下

if person not in searched: # 僅當這個人沒被檢查過時才檢查

if person_is_seller(person):

print(person + "is a mango seller!")

return true

else:

# 否則將這個人的朋友都加入到搜尋佇列

search_queue += graph[person]

# 並將這個人標記為已被檢查過

# 如果佇列中沒有人是芒果銷售商

return false

search('you')

關於廣度優先搜尋的一些領悟

也不算是領悟吧,就是一些感想,樹的bfs很簡單,應該輕車熟路了,就是把節點放在佇列中,每次都把他的子節點再放進去,無腦遍歷就行了,因為樹相當於是有向的圖,所以不用標記每個點是否被遍歷過,因為每個點肯定都只遍歷一次,但是今天遇到了圖的bfs,說實話,圖一直都沒有複習,所以對於這種問題,思路還是沒那麼清...

廣度優先搜尋的學習

同樣也是用乙個迷宮的例子 includeusing namespace std struct note int main 地圖 int book 51 51 標記哪些點走過了 int next 4 2 右 下 左 上 int head,tail,flag int next x,next y int ...

演算法學習筆記 廣度優先搜尋 1

兩個步驟 1.使用圖來建立問題模型 2.使用廣度優先搜尋解決問題 圖用於模擬一組連線。圖由節點和邊組成。直接相連的節點稱為鄰居。當圖是有向圖的時候a b a指向b 那麼b是a的鄰居,a不是b的鄰居。當圖是無向圖的時候a b,他們互為鄰居。1 廣度優先搜尋是一種用於圖的查詢演算法。2 第一類問題 從節...