广度优先搜索
广度优先搜索(breadth-first search),简称BSF,
是用于图的查找算法。
解决的问题
(1) 从节点A出发,有前往B的路径的吗?
(2) 从节点B出发,前往B的哪条路径最短?
图
图:用于模拟不同的事物是如何连接的。
由节点(node)和边(edge)组成
一个节点可能与众多节点相连,这些节点称为邻居
有向图与无向图

思路
解决如何从节点A前往B,需要两步:
Step1: 使用图来建立问题模型
利用 散列表 实现
Python:字典(dict)
Step2: 使用广度优先搜索解决问题
利用 队列 实现
Python: 双端队列(deque)
时间复杂度
O(V + E) V: 顶点数 E: 边数
问题实例
假设我经营者芒果农场,想找一名产品销售商,应该如何找?
对此,应该先从自身的朋友开始查找,如果朋友没有就从朋友的朋友再开始找。

代码实例
"""广度优先搜索
广度优先搜索(breadth-first search),简称BSF,
是用于图的查找算法。
回答两类问题:
(1) 从节点A出发,有前往B的路径的吗?
(2) 从节点B出发,前往B的哪条路径最短?
图:用于模拟不同的事物是如何连接的。
由节点(node)和边(edge)组成
一个节点可能与众多节点相连,这些节点称为邻居
有向图与无向图
解决如何从节点A前往B,需要两步:
Step1: 使用图来建立问题模型
利用 散列表 实现
Python:字典(dict)
Step2: 使用广度优先搜索解决问题
利用 队列 实现
Python: 双端队列(deque)
时间复杂度:O(V + E) V: 顶点数 E: 边数
问题实例:
假设我经营者芒果农场,想找一名产品销售商,应该如何找?
对此,应该先从自身的朋友开始查找,如果朋友没有就从朋友的朋友再开始找。
"""
from collections import deque
def is_seller(name):
return name.endswith('m')
def search():
"""广度优先搜索
工作原理:
Step1: 创建一个队列,用于存储要查找的朋友
Step2: 弹出一个朋友
Step3: 检查这位朋友是否是芒果销售商
Step4.a: 是,大功告成,return True
Step4.b: 否,将这位朋友的所有朋友加入队列
Step5: 回到Step2
Step6: 如果队列为空,则表明你的交际网中没有芒果销售商
"""
searching_queue = deque()
searching_queue += graph.get('you')
searched = []
while searching_queue:
person = searching_queue.popleft()
if person not in searched:
if is_seller(name=person):
return True
else:
searching_queue.extend(graph.get(person))
searched.append(person)
else:
return False
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'] = []
if search():
print(f'找到啦!')
else:
print('啊哦!你的人际关系网中没有芒果销售商。')