搜索算法之“广度优先算法”----我的朋友圈里有叫小明的不?

写于开头的话:算法小菜鸡,边学边总结。

正文:

朋友圈适合用图来表示,如下图中左边“数据关系图”是我的朋友圈,画圈的点是“我”。此图为有向图,(应该画上箭头会更准确),我有3个朋友,我的朋友又各自有0到多个朋友。

要找出小明,就是从这个图中找。

下图中右边是代码实现时的查找路径,一会从代码中可以看到该数据流向。

图:完全基于个人理解的总结,一千个人眼中有一千个林黛玉,所以可略过,直接看代码,若代码不明白,可一看。

 上菜:

from collections import deque

# 问题:找出关系图中有没有小明

# 1. 定义数据关系图
graph = {}
graph['bob'] = ['liming', 'xiaohong']

graph['liming'] = ['lixiao', 'lida']
graph['xiaohong'] = []

graph['lixiao'] = ['xiaoming']
graph['lida'] = ['dali']

graph['xiaoming'] = []
graph['dali'] = []


def search(name):
    search_deque = deque()
    searched = {}
    search_deque.append(name)
    while search_deque:
        search_name = search_deque.popleft()
        if not searched.get(search_name):
            if search_name == 'xiaoming':
                return True
            else:
                search_deque.extend(graph[search_name])
    return False


if __name__ == '__main__':
    # 2. 查找小明
    res = search('bob')
    print(res)

运行该脚本,会输出True。

试试把小明去掉。

参考资料:书籍《算法图解》(微信读书有)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值