第六章 广度优先搜索
广度优先搜索算法 (英文: Breadth-First-Search, 缩写为BFS), 又称宽度优先搜索, 或横向优先搜索, 是一种图形搜索算法。 简单的说, BFS 是从根节点开始, 沿着树的宽度遍历树的节点。 如果所有节点均被访问, 则算法终止。 广度优先搜索的实现是一般采用 open-closed 表
[图片上传失败...(image-28dbd4-1527845362464)]
书中列举了好几个例子来讲述什么是广度优先搜索, 讲的很容易理解的。
芒果销售商问题。 目标是在你的人际关系网找到一位芒果销售商, 如果 A 不是芒果销售商, 就将他的朋友也加入到查找名单中。 也就意味着你将在他的朋友、 朋友的朋友等中查找。 使用这种算法将遍历你的整个人际关系网, 直到找到芒果销售商。 这就是广度优先搜索算法
# coding: utf-8
"""
这是书中芒果销售商问题
名字中以`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 search(name):
search_deque = deque()
search_deque += graph[name]
searched = []
while searched:
person = search_deque.popleft()
if person is not searched:
if person_is_seller(person):
print('Person' + person + 'is a mango seller')
return True
else:
search_deque += graph[person]
searched.append(person)
return False
def person_is_seller(name):
return name[-1] == 'm'
print(search('you'))
队列
队列是先进先出, 栈是先进后出
小结
- 广度优先搜索指出是否有从A到B的路径, 如果有广度优先搜索将找出最短路径
- 对于寻找最短路径问题, 可使用图来建模, 再使用广度优先搜索来解决问题
- 对于检查过的人, 不需要再去检查了, 否则可能导致无限循环
网友评论