广度优先搜索是一种用于图的查找算法,可帮助回答两类问题:
1.从节点A出发,有前往节点B的路径吗?
2.从节点A出发,前往节点B的哪条路径最短?
查找原则:如果朋友是一度关系,朋友的朋友是二度关系,因此,你应该先在一度关系中搜索,确定其中没有你要查找的目标,才在二度关系中搜索,以此类推。
代码
(在所创建的朋友圈字典中查找特定的人)
# 用字典实现一个关系图
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
# 定义查找条件函数 假设最后一个字母为'm'的人为查找目标
def people_is_seller(name):
if name[-1] == 'm':
return True
else:
return False
def search(name):
# 创建一个队列
search_queue = deque()
# 将当前people所有邻居加入队列
for people in graph[name]:
search_queue.append(people)
# 记录已经检查过的people
searched = []
# 当队列不为空
while search_queue:
# 队头出队 队尾出队用deque.pop()
person = search_queue.popleft()
# 是所要查找的人
if person not in searched:
if people_is_seller(person):
print(person + " is your find people")
return True
else:
# 不是所要查找的人,就将这个人的邻居都加入搜索队列
for neighbor in graph[person]:
search_queue.append(neighbor)
searched.append(person)
return False
if __name__ == "__main__":
search("you")