《算法圖解》第六章筆記_廣度優先搜索


軟件環境: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")

 

 

四、小結

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM