美文网首页
python 广度优先算法

python 广度优先算法

作者: 落羽归尘 | 来源:发表于2019-08-04 11:20 被阅读0次

文章概述

广度优先搜索算法概述

广度优先搜索算法

广度优先算法是基于树或者图的,当然树也是一种特殊的图,因此我们先简单的介绍下图的相关知识。
介绍:图在计算机学科中是一种重要的数据结构,是树的拓展,由节点和边构成,边可以有权重,也可以有方向,当然,也可以没有。如下简单无向图:



有向图是方向的,用箭头表示:


背景

想要求一个地点到另一个地点,如下图所示,求A到D的最短距离,已知相邻节点之间的距离是相同的。


实现图:

首先用代码表示图,建立数据结构。
那么图如何表示呢,我们知道,图是由节点构成的,每个节点可能有邻居,如A的邻居有B、C,B的邻居是D,D没有邻居,那么我们可以用dict来表示这些关系

graph = {}
graph['A'] = ['B', 'C']

graph['B'] = ['D']
graph['C'] = ['E']

graph['D'] = []
graph['E'] = ['D']

广度优先搜索算法

算法描述:
1.创建一个队列,用于存储要检查的节点
2.从队列首部弹出一个节点
3.判断这个节点是否检查过,若检查过,重复执行步骤2
4.检查这个节点是否目的节点,是的话,完事,否则,将这个节点的邻居加入队列的尾部,重复2,3,4,一直到队列为空

from collections import deque

graph = {}
graph['A'] = ['B', 'C']

graph['B'] = ['D']
graph['C'] = ['E']

graph['D'] = []
graph['E'] = ['D']

def solution(start, end):  #起点和终点
    queue = deque()      #创建一个队列
    queue += graph[start]   #先把起点的邻居加入队列,检查一级关系

    searched = [start]      # 已检查的点,防止造成死循环, 起点不用检查可以加进来

    while queue:  
        address = queue.popleft()  # 弹出节点
        if address not in searched:
            if address == end:
                searched.append(end)  
                return searched  # 返回所有已检查的节点,为后续打印最短路径做准备
            else:
                queue += graph[address]
                searched.append(address)
    return False

searched = solution('A','D')

如果searched 存在,就代表有路径可以让A通往D,其实这个代码实现了一种搜索算法,检索A到D是否存在可达路径,且搜索的时候走的是最短路径。
另外时间复杂度,这个过程我们使用到了队列,将每个节点添加进去的时间都是固定的,为O(1),那么广度优先搜索算法的时间复杂度为O(V+E),其中V为节点数,E为边数。
下面我们想个办法打印出这个最短路径来。

# 求搜索经历的最短路径
#接上面代码 searched 是一个列表
l = []
address = 'D'
l.append(address)
while address != 'A': 
    for i in searched:
        if address in graph[i]:
            l.append(i)
            address = i
            break
print(l[::-1])

我们根据目的节点,反向打印路径中节点,然后取反就是我们的最短路径了['A','B','D']
当然此算法还可以优化,大家可以发动脑筋。

相关文章

  • Algorithm进阶计划 -- 广度优先算法

    广度优先算法广度优先算法框架广度优先算法运用 1. 广度优先算法框架 DFS(Deep First Search)...

  • python 广度优先算法

    文章概述 广度优先搜索算法概述 广度优先搜索算法 广度优先算法是基于树或者图的,当然树也是一种特殊的图,因此我们先...

  • 搜索算法

    BFS广度优先算法(Breadth-First Search) A*算法的出现时因为 深度/广度优先算法找到的路径...

  • 【数据结构】广度优先搜索算法BFS

    对于广度优先遍历算法DFS可以参考前一篇文章【数据结构】深度优先搜索算法DFS 广度优先遍历 广度优先遍历(Bre...

  • 广度优先搜索算法(BFS)

    广度优先搜索算法(BFS) 标签(空格分隔): algorithm 1.广度优先搜索算法(Breadth Firs...

  • 广度优先搜索算法

    上一篇简书小编分享了“深度优先搜索”算法,今天小编继续分享下“广度优先搜索”算法。 一、何为“广度优先搜索” 广度...

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • python分布式爬虫搜索引擎实战-2-深度优先和广度优先

    深度优先和广度优先 目录: 网站的树结构 深度优先算法和实现 广度优先算法和实现 网站url树结构:分层设计 子域...

  • 算法与数据结构 之 搜索算法

    搜索分为广度优先搜索、深度优先搜索、A*算法。 一、广度优先算法(BFS) 1.1、基本实现和特性:BFS是从一个...

  • 爬虫(3-5)

    深度优先和广度优先1 网站的树结构2 深度优先算法和实现3 广度优先算法和实现 深度优先输出A,B,D,E,I,C...

网友评论

      本文标题:python 广度优先算法

      本文链接:https://www.haomeiwen.com/subject/juzsdctx.html