广度优先搜索为图算法的一种,用来找出两样事物之间的最短距离。而图是由多个节点组成,为了反映节点之间的存储关系,散列表就派上用场了。
与前三种算法不同的是,前者都是基于序列表,比如数组或者列表,后者是基于散列表和队列。散列表能够将键映射到值,可以用来表达类似于“你→Bob”这样的节点关系。需要按照加入顺序检查列表中的人,否则找到的就不是最短路径,因此搜索列表必须是队列(“先进先出”)。
一、过程:
如图所示:——转自书《算法图解》,自己就不画图和写步骤了。
二、代码:
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 search(name):
search_queue = deque() # 创建一个双端队列
search_queue += graph[name] # 将name的邻居都加入到这个搜索队里
searched = [] # 该数组用于记录检查过的人
while search_queue: # 非零为真,即当队列不为空
person = search_queue.popleft() # 取出队列的第一个人
if not person in searched:
if person_is_seller(person): # 如果是经销商,就输出
print(person + " is a mango seller!")
return True
else: # 如果不是经销商,就把邻居加进队列
search_queue += graph[person]
searched.append(person)
return False
def person_is_seller(name):
return name[-1] == 'm'
search("you")
三、输出:
thom is a mango seller!