【算法圖解】——圖、廣度優先搜索並實現搜索

  • 節點(node)和邊(edge)
  • 代表着一種連接關係
  • 解決的問題:最短路徑,象棋中將對方將死最少步數
無向圖和有向圖

在這裏插入圖片描述
無向圖互爲鄰居

廣度優先算法

通過圖的連接關係,一步一步搜索

問題解決步驟

  1. 使用圖建立問題模型
  2. 使用廣度優先算法解決問題

實現圖

利用字典實現圖
在這裏插入圖片描述
注意:peggy是alice的鄰居,但alice不是peggy的

"""實現圖——字典"""
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'] = []

實現廣度優先搜索

通過隊列實現
在這裏插入圖片描述

  1. 創建雙端隊列
  2. 將你要搜索對象的關係網拉入隊列
  3. 只要隊列不空就搜索
  4. 先獲取網中第一個人
  5. 判斷是都檢查過
  6. 判斷是否滿足搜索條件
  7. 不滿足——將該人的關係網也加入到隊列中,並將此人加入到判斷過列表中
  8. 循環
"""先判斷是否檢查過這個人"""
from collections import deque


def person_is_seller(name):
    return name[-1] == 'm' # 檢查人的名字末尾是否爲‘m’,是則return True,不是則return False

def search(name):
    search_queue = deque() # 創建雙端隊列
    search_queue += graph[name] # 將name的關係網(鄰居)加入到隊列中
    
    searched = [] # 這個數組用於記錄檢查過的人
    
    while search_queue:# 隊列不空
        person = search_queue.popleft()
        if person not in searched:
            if person_is_seller(person):
                print("Find " + person)
            else:
                search_queue += graph[person] # 將person的鄰居加入到隊列中
                searched.append(person)
                
search('you')

Find thom

注意:一定要判斷重複,除了減少重複檢查,也避免無限循環

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