Python查找算法之广度优先搜索

目录

  • 广度优先搜索
  • 解决的问题
  • 有向图与无向图
  • 思路
  • 时间复杂度
  • 问题实例
  • 代码实例

广度优先搜索

广度优先搜索(breadth-first search),简称BSF,
是用于图的查找算法。

解决的问题

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

图:用于模拟不同的事物是如何连接的。
    由节点(node)和边(edge)组成
    一个节点可能与众多节点相连,这些节点称为邻居

有向图与无向图

Python查找算法之广度优先搜索_第1张图片

思路

解决如何从节点A前往B,需要两步:
Step1: 使用图来建立问题模型
       利用 散列表 实现
       Python:字典(dict)

Step2: 使用广度优先搜索解决问题
       利用 队列 实现
       Python: 双端队列(deque)

时间复杂度

O(V + E)  V: 顶点数   E: 边数

问题实例

假设我经营者芒果农场,想找一名产品销售商,应该如何找?
对此,应该先从自身的朋友开始查找,如果朋友没有就从朋友的朋友再开始找。

Python查找算法之广度优先搜索_第2张图片

代码实例

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""广度优先搜索

广度优先搜索(breadth-first search),简称BSF,
是用于图的查找算法。

回答两类问题:
(1) 从节点A出发,有前往B的路径的吗?
(2) 从节点B出发,前往B的哪条路径最短?

图:用于模拟不同的事物是如何连接的。
    由节点(node)和边(edge)组成
    一个节点可能与众多节点相连,这些节点称为邻居

有向图与无向图

解决如何从节点A前往B,需要两步:
Step1: 使用图来建立问题模型
       利用 散列表 实现
       Python:字典(dict)

Step2: 使用广度优先搜索解决问题
       利用 队列 实现
       Python: 双端队列(deque)

时间复杂度:O(V + E)  V: 顶点数   E: 边数

问题实例:
假设我经营者芒果农场,想找一名产品销售商,应该如何找?
对此,应该先从自身的朋友开始查找,如果朋友没有就从朋友的朋友再开始找。
"""
from collections import deque


def is_seller(name):
    return name.endswith('m')


# BSF
def search():
    """广度优先搜索

    工作原理:
        Step1: 创建一个队列,用于存储要查找的朋友
        Step2: 弹出一个朋友
        Step3: 检查这位朋友是否是芒果销售商
        Step4.a: 是,大功告成,return True
        Step4.b: 否,将这位朋友的所有朋友加入队列
        Step5: 回到Step2
        Step6: 如果队列为空,则表明你的交际网中没有芒果销售商
    """
    # 创建队列
    searching_queue = deque()
    # 从自身朋友开始查找
    searching_queue += graph.get('you')
    # 用于存储已检查过的朋友,避免无限循环
    searched = []
    # 直到队列为空
    while searching_queue:
        # 弹出一位小朋友
        person = searching_queue.popleft()
        # 避免重复检查
        if person not in searched:
            # 检查是否是芒果销售商
            if is_seller(name=person):
                return True
            else:
                # Step4.b,将这位朋友的朋友加入队列
                searching_queue.extend(graph.get(person))
                # 标记这位朋友已被检查
                searched.append(person)
    else:
        return False


# 建立问题模型
graph = {}
graph['you'] = ['alice', 'bob', 'claire']
graph['bob'] = ['anuj', 'peggy']
graph['alice'] = ['peggy']
graph['claire'] = ['thom', 'jonny']
graph['anuj'] = []  # 表明anuj没有朋友
graph['peggy'] = []
graph['thom'] = []
graph['jonny'] = []


if search():
    print(f'找到啦!')
else:
    print('啊哦!你的人际关系网中没有芒果销售商。')

你可能感兴趣的:(Python3,Python,查找算法,图,广度优先搜索,BSF)