算法图解-广度优先搜索

广度优先搜索是一种用于图的查找算法,可帮助 回答两类问题。

  • 从节点A出发,有前往节点B的路径吗?
  • 从节点A出发,前往节点B的哪条路径最短?

例如,你想从你的朋友中找出谁是关系最近的芒果销售商。关系如下图。
朋友是一度关系,朋友的朋友是二度关系。

广度优先的思想是先在一 度关系中搜索,确定其中没有芒果销售商后,才在二度关系中搜索。

1536305354301

算法思路:

  1. 创建一个队列,用于存储需要检查的人。
  2. 从队列弹出一个人。
  3. 检查这个人是否是芒果供应商。
  4. if True:return 得到答案;else:把她的所有邻居加入队列。
  5. 继续回到第二步。
  6. 如果到列表为空都没输出结果,说明关系网中没有芒果供应商;return None。
# 数据准备
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 person_is_seller(name):
 return name[-1] == 'm' 


def breadth_first_search(data_dict):
    # 避免重复检查和死循环
    chacked_list = []
    search_queue = deque()
    search_queue.extend(data_dict['you'])
    while search_queue:
        person = search_queue.popleft()
        if person in chacked_list:
            continue
        if person_is_seller(person):
            print(person + " is a mango seller")
            return True
        else:
            search_queue.extend(data_dict[person])
            chacked_list.append(person)
    print("no mango seler in yor frends net.")
    return False

总结:

  • 广度优先搜索指出是否有从A到B的路径。如果有,广度优先搜索将找出最短路径。

  • 你需要按加入顺序检查搜索列表中的人,否则找到的就不是最短路径,因此搜索列表必须是队列。

  • 对于检查过的人,务必不要再去检查,否则可能导致无限循环

参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值