广度优先遍历是一种用于图的查找算法,它可以帮助我们解决两类问题。第一类问题:从节点A到节点B有没有联通的路径。第二类问题:广泛应用于各大导航App,从节点A出发,前往节点B的哪条路径最短。
参考资料:《算法图解》作者:[美] Aditya Bhargava 译者:袁国忠
在介绍广度优先遍历的具体内容之前,先让我们了解一下图的概念。
图模拟的是一组连接。是由节点(node)与边(edge)组成的。一个节点可以与多个节点直接相连,直接相连的点称之为邻居。如图
现在我们来介绍一下第一个问题:存在从A到B的路径吗?
假如你是一位农民,家里种了几亩大葱,现在葱已经可以卖了,那么你就应该去联系客户来收购。在现在信息发达的时代,你可以直接上网搜索,但是在前几年网络还不是那么普及的时候,你只能通过人际关系网来查找。首先,你要找一下你的朋友名单里面有没有收购商,如果存在收购商,那么就完成我们的目的了。如果没有,那么就去询问朋友的朋友是不是购销商,如果有,那么结束查询,如果没有,继续。。。。
接下来我们用伪代码来实现这个广度优先遍历
from collections import deque
def Search(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('success')
return
else:
search_queue += graph[person]
searched.append(person)
print('fail')
print(search_queue)
def person_is_seller(name):
return name[-1] == 'm'
if __name__ == "__main__":
graph = {}
graph["you"] = ["老王", "老程", "老刘", "老宋"]
graph["老王"] = []
graph["老刘"] = ["老李", ]
graph["老宋"] = ["老孙", "老钱"]
graph["老程"] = ["老吴m"]
graph["老李"] = ["老周"]
Search("you")
首先我们导入库deque。用来生成一个双端队列。然后从graph的第一层
{'老刘': ['老李'], '老程': ['老吴m'], '老王': [], 'you': ['老王', '老程', '老刘', '老宋'], '老宋': ['老孙', '老钱'], '老李': ['老周']}
开始遍历,如果没有我们需要的人(名字后面带m的就是我们需要的人)就把他的朋友(即他的子集)加入进来,第一层没有就开始第二层的循环,知道找到我们需要的人为之。