算法——广度优先搜索
广度优先搜索(breath-first search, BFS):解决最短路径(shortest-path problem)的算法被称为广度优先搜索。
队列(queue):一种先进先出(First In First Out, FIFO)的数据结构,只支持入队和出队两种操作。
要点:
广度优先搜索指出是否有从A到B的路径
如果有,广度优先搜索将找出最短路径
面临类似于寻找最短路径的问题时,可尝试使用图来建立模型,再使用广度优先搜索来解决问题
队列是先进先出的(FIFO)
栈是后进先出的(LIFO)
需要按加入的顺序检查搜索列表中的人,否则找到的就不是最短路径,因此搜索列表必须是队列
对于检查过的元素,务必不要再去检查,否则可能导致无限循环
# breath_first_search.py 解决最短路劲问题(shortest-path problem)的广度优先搜索 from collections import deque def person_is_seller(name): return name[-1] == ‘m‘ # 检查是否名字以m结尾 def search(name): search_queue = deque() # 创建一个队列 search_queue += graph[name] # 将你的朋友都加入到这个搜索队列中 searched = [] # 已经检查过的人 while search_queue: # 只要队列不为空 person = search_queue.popleft() # 取出一个人 if person_is_seller(person): # 如果这个人是我们要找的人 print(person + ‘ is a mango seller!‘) return True else: searched.append(person) search_queue += graph[person] # 如果不是,将这个人的朋友也加入到搜索队列中 return False def practice(): # 练习 graph = {} graph[‘get up‘] = [‘exercise‘, ‘brush teeth‘, ‘pack lunch‘] graph[‘brush teeth‘] = [‘have breakfast‘] graph[‘exercise‘] = [‘take a shower‘] graph[‘take a shower‘] = [‘get dressed‘] graph[‘have breakfast‘] = [] graph[‘pack lunch‘] = [] graph[‘get dressed‘] = [] queue = deque() queue += graph[‘get up‘] done = [] print(‘get up‘) while queue: do = queue.popleft() if do in done: pass else: print(do) queue += graph[do] done.append(do) if __name__ == ‘__main__‘: 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‘] = [] search(‘you‘) practice()
原文:https://www.cnblogs.com/noonjuan/p/10923826.html