广度优先搜索
算法——广度优先搜索
广度优先搜索(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()