一、圖簡介
如果用廣度優先搜索方法:
第一步(藍色線條):從雙子峯有兩條路可以走,這兩條路走完便走到2號點,此時並未走到金門大橋。
第二步(黑色線條):此時並未發現發現黑色線條到達了金門大橋
第三步(橙色線條):此時有一個線條到達了金門大橋,那麼這條線路既可以到達金門大橋還是最短路徑,因爲這是我們第一次發現金門大橋,如果再進行第四步的話,就又有兩條路線到達金門大橋但是它們都多走了一步,其實有點像(地毯式搜索)
二、廣度優先搜索
現在假如你經營着一個蘋果果園,你想要找蘋果銷售商。
第一步:此時你開始搜索你的朋友中有沒有蘋果銷售商,那麼你的朋友就可以形成一個列表,如果你的朋友中沒有蘋果銷售商。
第二步:那麼你開始搜索你朋友的朋友,你的朋友的朋友又可以形成列表,那麼就又會形成多個列表(取決於你有多少朋友,假如你的朋友的朋友除了你就沒有了朋友(就是他只有你一個朋友),那麼他的朋友列表就爲空),這幾個列表就會添加到你的要搜索的列表裏。
第三步:再次搜索每一個列表,如果沒有,再進行重複操作。
而如果想要找到跟你關係最近的那個銷售商(就是假如你的朋友的朋友是銷售商和你朋友的朋友的朋友銷售商,你肯定先要找那個關係近的),所以爲達到這個目的就需要按照添加順序去尋找。
現在你可能知道了大概意思但是還完全不會轉換爲代碼,那麼下面在介紹了一種數據結構。
三、隊列
1、隊列類似於棧,你不能隨機地訪問隊列中的元素。隊列只支持兩種操作:入隊和出隊。
2、如果你將兩個元素加入隊列,先加入的元素將在後加入的元素之前出隊。因此,你可使用隊列來表示查找名單!這樣,先加入的人將先出隊並先被檢查。
3、隊列是一種先進先出的數據結構,而棧是一種後進先出的數據結構。
4、在Python中,可使用函數deque來創建一個雙端隊列。
其實隊列通俗點講,假如你去公交車站等候需要排隊,先來的的人站在前面,後來的人站在後面,站在前面的人先上車,後來的後上車。
四、實現算法
def search(name):
queue= deque() #建立隊列
queue += graph[name]
searched = [] #這個數組用於記錄檢查過的人
while queue: #只要隊列不爲空,
person = queue.popleft() #就取出其中的第一個人
if not person in searched: #僅當這個人沒檢查過時才檢查
if seller(person): #檢查這個人是否是蘋果銷售商
print person + " 是銷售商"
return True
else:
queue += graph[person] #不是蘋果銷售商。將這個人的朋友都加入搜索隊列
searched.append(person) #將這個人標記爲檢查過,添加到searched列表中
return False
這個代碼中,seller是一個函數,需要你去定義如何判斷這個是否是銷售商。
爲什麼要加searched這個列表呢?那是因爲如果你去檢查已經檢查過的人,很有可能會出現無限循環,
a[name]是一個散列表(在Python中就是字典),這個代碼要想運行成功,你得先把你的朋友網中各種關係用散列表表示出來,例如:
調用的時候只需要把“you”傳遞給name即可運行
這個代碼我的理解:
先判斷我的第一個朋友是不是銷售商,如果不是,就把他的朋友放在後面(注意是放在我的所有朋友後面),然後檢查我的第二個朋友是不是銷售商,依此類推,會按照順序形成一個隊列,排在前面的關係近先檢查。