1. 程式人生 > >《算法圖解》筆記(5) 廣度優先搜索

《算法圖解》筆記(5) 廣度優先搜索

int earch urn 組成 port 銷售商 問題 時間 找到

圖算法——廣度優先搜索(breadth-first search,BFS)

解決最短路徑問題的算法被稱為廣度優先搜索。

圖是什麽?圖模擬一組連接,由節點(node)和邊(edge)組成。一個節點可能與眾多節點直接相連,這些節點被稱為鄰居。

問題:假設你經營著一個芒果農場,需要尋找芒果銷售商,以便將芒果賣給他。在通訊錄中,你與芒果銷售商有聯系嗎?為此,你可在朋友中查找。

找橘子商示例代碼:

from collections import deque

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: #繼續搜索s_q = s_q + graph[person] 後面一項是person的鄰居 search_queue +=graph[person] #將這個人標記為檢查過 searched.append(person) print("not found") return False def person_is_seller(name):
return name[-1] == m #測試 graph ={} graph["you"] = ["alice","bob","c"] graph["alice"] =[] graph["bob"] = [] graph["c"] = [] search("you")

運行時間

廣度優先搜索的運行時間為O(人數 + 邊數),這通常寫作O(V + E),其中V為頂點(vertice)數,E為邊數。

小結

  • 廣度優先搜索指出是否有從A到B的路徑。
  • 如果有,廣度優先搜索將找出最短路徑。
  • 面臨類似於尋找最短路徑的問題時,可嘗試使用圖來建立模型,再使用廣度優先搜索來解決問題。
  • 有向圖中的邊為箭頭,箭頭的方向指定了關系的方向,例如,rama→adit表示rama欠adit錢。
  • 無向圖中的邊不帶箭頭,其中的關系是雙向的,例如,ross - rachel表示“ross與rachel約會,而rachel也與ross約會”。
  • 隊列先進先出(FIFO)的。
  • 後進先出(LIFO)的。
  • 你需要按加入順序檢查搜索列表中的人,否則找到的就不是最短路徑,因此搜索列表必須是隊列。
  • 對於檢查過的人,務必不要再去檢查,否則可能導致無限循環。

《算法圖解》筆記(5) 廣度優先搜索