【Python_037】算法 | 广度优先搜索BFS

本篇博客介绍广度优先搜索 (breadth-first search, BFS)

广度优先搜索
  • 一种图算法

  • 可回答用于两类问题:

    1. 从节点A出发,有前往节点B的路径吗?
    2. 从节点A出发,前往节点B的路径中哪条路径最短?
  • 本质上就是一个队列(先进先出,也称为FIFO – First In First Out)

具体实例

上图源于《算法图解》
*上图源于《算法图解》

问题: 利用BFS找到最近的名字结尾带M的朋友

算法思路:

  1. 从自己开始,依次检查自己的一度好友
  2. 若一度好友中没有符合条件的名字,则将好友的好友加入待检查队列中
  3. 待所有一度好友检查完后,开始检查二度好友。
  4. 重复以上三步,直到找到符合条件的名字或者全部检查完发现没有符合条件的名字

代码实现:

from collections import deque

def if_seller(name):
    return name[-1] =='m'

graph = {}
graph['you'] = ['alice','bob','claire']
graph['bob'] = ['anuj','peggy']
graph['alice'] = ['peggy']
graph['claire'] = ['thom','jonny']
graph['peggy'] = []
graph['thon'] = []
graph['jonny'] = []
graph['anuj'] = []


def search(name):
    search_queue = deque() #创建一个双端队列,比list有更低的空间和时间复杂度
    search_queue += graph[name]
    searched = [] #用于放已检查过的人,没有这步会导致无限循环

    while search_queue:
        person = search_queue.popleft()
        if person not in searched:
            if if_seller(person):
                print(f'Found {person}')
                return True
            else: 
                search_queue += graph[person]
    return False 
    

search('you')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值