预备知识
图
图模拟一组连接,由节点和边构成
队列
一种 先进先出 的数据结构
1 |
2 |
3 |
4入 |
1 |
2 |
3 |
4 |
1出 |
2 |
3 |
4 |
广度优先算法
用于图的查找算法
广度优先算法的核心思想是:从初始节点开始,应用算符生成第一层节点,检查目标节点是否在这些后继节点中,若没有,再用产生式规则将所有第一层的节点逐一扩展,得到第二层节点,并逐一检查第二层节点中是否包含目标节点。若没有,再用算符逐一扩展第二层的所有节点……,如此依次扩展,检查下去,直到发现目标节点为止。
示例
(1)用python创建如下图
其中Thom是你所要找的人——mango seller。
graph = dict()
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["peggy"] = []
graph["anuj"] = []
graph["thom"] = []
graph["jonny"] = []
(2)采用广度优先算法查找
from graph_your_neighbor import * # 导入模块下的全部定义
from collections import deque
def search_queue(name):
search_queue = deque()
search_queue += graph[name]
searched = []
while search_queue: #只要队列不为空
person = search_queue.popleft() #取出队列中第一个人
if person not in searched: #不重复检查
if person_is_seller(person):
print(f"{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" # 检查姓名是否以'm'结尾
#你也可以写 name == "thom"
search_queue("you")