广度优先搜索是一种用于图的查找算法,可帮助回答两类问题。
第一类问题:从节点A出发,有前往节点B的路径吗?
第二类问题:从节点A出发,前往节点B的哪条路径最短?
一、队列
队列类似于栈,不能随机地访问队列中的元素。队列只支持两种操作:入队和出队。
队列是一种先进先出的数据结构,而栈是一种后进先出的数据结构。
在python中,可使用函数deque来创建一个双端队列。
from collections import deque
search_queue=deque()
二、 python实现
寻找芒果销售商(以m结尾)。
from collections import deque
#实现图
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']=[]
def person_is_selller(name):
return name[-1]=='m'
def search(name):
search_queue=deque()
search_queue+=graph[name]
searched=[] #记录检查过的人
while search_queue:
person=search_queue.popleft()
if not person in searched: #仅当这个人没检查过时才检查
if person_is_selller(person):
print("%s is a mango seller!"%(person))
return True
else:
search_queue+=graph[person]
searched.append(person) #将这个人标记检查过
return False
search("you")
运行结果:
thom is a mango seller!