算法圖解第六章廣度優先搜索(學習筆記)

一、圖簡介

在這裏插入圖片描述

如果用廣度優先搜索方法:
第一步(藍色線條):從雙子峯有兩條路可以走,這兩條路走完便走到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即可運行

這個代碼我的理解:

先判斷我的第一個朋友是不是銷售商,如果不是,就把他的朋友放在後面(注意是放在我的所有朋友後面),然後檢查我的第二個朋友是不是銷售商,依此類推,會按照順序形成一個隊列,排在前面的關係近先檢查。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章