軟件環境:Python 3.7.0b4
一、算法描述
假設你經營着一家芒果農場,需要尋找芒果銷售商,以便將芒果賣給他。為此,我們可以通過廣度優先搜索算法,在朋友中查找出符合條件的芒果銷售商。
廣度優先搜索是一種用於圖的查找算法,可幫助我們回答兩類問題:
- 第一類問題:從節點A出發,有前往節點B的路徑嗎?(在你的人際關系網中,有芒果銷售商嗎?)
- 第二類問題:從節點A出發,前往節點B的哪條路徑最短?(哪個芒果銷售商與你的關系最近?)
二、實現圖
將下列關系圖用散列表實現

graph = {} graph["you"] = ["alice", "bob", "claire"] graph["bob"] = ["anuj", "peggy"] graph["alice"] = ["peggy"] graph["claire"] = ["thom", "jonny"] graph["anuj"] = [] graph["peggy"] = [] graph["thom"] = [] graph["jonny"] = []
注:Anuj、Peggy、Thom和Jonny都沒有鄰居,這是因為雖然有指向他們的箭頭,但沒有從他們出發指向其他人的箭頭。這被稱之為有向圖(directed graph),其中的關系是單向的。而無向圖(undirected graph)沒有箭頭,直接相連的節點互為鄰居。
三、實現算法
概述廣度優先搜索算法的工作原理:

完整實現代碼如下:
from collections import deque def person_is_seller(name): return name[-1] == 'm' graph = {} graph["you"] = ["alice", "bob", "claire"] graph["bob"] = ["anuj", "peggy"] graph["alice"] = ["peggy"] graph["claire"] = ["thom", "jonny"] graph["anuj"] = [] graph["peggy"] = [] graph["thom"] = [] graph["jonny"] = [] def search(name): search_queue = deque() # 創建一個隊列 search_queue += graph[name] # 將你的鄰居都加入到這個搜索隊列中 searched = [] # 該數組用於記錄檢查過的人 while search_queue: # 只要隊列不為空 person = search_queue.popleft() # 就取出其中的第一個人 if not person in searched: # 僅當這個人沒檢查過時才檢查 if person_is_seller(person): # 檢查這個人是否是芒果銷售商 print (person + " is a mango seller!") # 是芒果銷售商 return True else: search_queue += graph[person] # 不是芒果銷售商。將這個人的朋友都加入搜索隊列 searched.append(person) # 將這個人標記為檢查過 return False # 隊列中沒人是芒果銷售商 search("you")

四、小結
- 隊列是先進先出的。
- 棧是后進先出的。
- 你需要按加入順序檢查搜索列表中的人,否則找到的就不是最短路徑,因此搜索列表必須是隊列。
- 對於檢查過的人,務必不要再去檢查,否則可能導致無限循環。
