圖
- 節點(node)和邊(edge)
- 代表着一種連接關係
- 解決的問題:最短路徑,象棋中將對方將死最少步數
無向圖和有向圖
無向圖互爲鄰居
廣度優先算法
通過圖的連接關係,一步一步搜索
問題解決步驟
- 使用圖建立問題模型
- 使用廣度優先算法解決問題
實現圖
利用字典實現圖
注意: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'] = []
實現廣度優先搜索
通過隊列實現
- 創建雙端隊列
- 將你要搜索對象的關係網拉入隊列
- 只要隊列不空就搜索
- 先獲取網中第一個人
- 判斷是都檢查過
- 判斷是否滿足搜索條件
- 不滿足——將該人的關係網也加入到隊列中,並將此人加入到判斷過列表中
- 循環
"""先判斷是否檢查過這個人"""
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
注意:一定要判斷重複,除了減少重複檢查,也避免無限循環