Python算法入门——第3章 3.3 广度优先遍历

广度优先遍历是一种用于图的查找算法,它可以帮助我们解决两类问题。第一类问题:从节点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的就是我们需要的人)就把他的朋友(即他的子集)加入进来,第一层没有就开始第二层的循环,知道找到我们需要的人为之。

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值