广度优先算法(BFS)
根据访问节点的顺序与方式,可以分为广度优先算法(BFS)和深度优先算法(DFS),本文我打算先介绍广度优先算法:
广度优先算法
1. 算法概述
广度优先搜索算法(又称宽度优先搜索、BFS)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。
BFS并不使用经验法则算法。所谓广度,就是一层一层的,向下遍历,层层堵截,从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。一般的实验里,其邻居节点尚未被检验过的节点会被放置在一个被称为 open 的容器中(例如队列或是链表),而被检验过的节点则被放置在被称为 closed 的容器中。
2.原理详解
本文中,我们使用广度优先算法给图做一个遍历,从而介绍它的原理。
(可以将整个过程想象成一颗树形的结构)
a、建立一个队列(队列遵循先进先出原则),并把根节点放入队列。
b、从队列取出一个节点,将此节点的所有下一级子节点放入队列。
c、重复步骤b,直至找到目标或者完成对整个图的遍历时停止。
举个例子,利用BFS完成对一个无向图的遍历:
先给出一个图:
首先我们选定A作为起始节点,对图进行遍历。
当A作为初始节点时,那么A就是我们BFS走的第一个节点。.
接下来我们要做的就是观察与A相邻的下一层有哪些节点(可以看到在A的下一层有BC,那么BC就是BFS的第二层,以此类推)。
就这样从起始节点A开始,对图的每一层进行遍历就称为广度优先算法的搜索方式。
而BFS的具体实现的话,我们可以构建一个队列(队头出,队尾进),选择A为初始节点时,A就处于队列中(此时队列中就只存在A)。
接下来,将A拿出,寻找A的下一层节点(B、C)并放入队列(遍历节点A的下一层)。当将A的所有下一层节点全部放入队列之后(此时队列中的顺序假设为B>C),接下来去取出队列中的下一个节点进行与A相同的操作,直至队列为空(既完成对图遍历)。
按照以上描述,把拿出队列的次序看做遍历时所走节点的顺序,那么遍历的结果为:A B C D E F
需要注意的是:
- 给定的起始节点可以是随机的。
- 遍历时,必须严格按照规则对队列进行操作(队头出,队尾进),那么也就是说 遍历次序(A B C E D F)是不被允许的,因为按照队列规则,节点B应该会比节点C先进行遍历,而节点E是C的子节点,所以这样的遍历次序是不被允许的。
- 就算起始节点相同,也会有不同的结果。
3.代码描述
在这儿我们把上面的这个使用BFS对图进行遍历的例子用代码描述出来,因为我目前在学python,所以算法描述我也打算使用python来写:
'''
创建一个字典,通过对图的每个节点的相邻节点的描述,构建出图(graph)
'''graph = {'A':['B','C'],'B':['A','C','D'],'C':['A','B','D','E'],'D':['B','C','E','F'],'E':['C','D'],'F':['D']}def BFS(graph,start):open = list(start) #将起始节点放入队列closed = set() #创建一个集合,存放已经走过的节点closed.add(start)while(len(open)>0):vertex = open.pop(0) #从队头取出一个节点nodes = graph[vertex]for node in nodes: #遍历当前节点的下一层节点if node not in closed:#若节点没有走过,则放入队列与集合open.append(node) closed.add(node)print(vertex,end='\t')BFS(graph,'E')
'''
假设选取E为起始节点,那么BFS运行的结果为:
E C D A B F
'''
广度优先算法(BFS)相关推荐
- (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)
链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构 队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...
- c语言bfs算法走迷宫,使用广度优先算法(BFS)走迷宫
前面介绍广度优先算法的时候提及了多次走迷宫,我们就真正的走一次迷宫试试! 要求如下: 输入给出迷宫矩阵的行数和列数,并给出迷宫(使用点 (.) 表示路,使用星 (*) 表示障碍物,使用S表示起点,T表 ...
- 树的前序、中序、后序遍历及深度优先算法DFS、广度优先算法BFS及python实现
刷Leetcode时遇到一种经典数据结构--树,树是典型递归思想来的,学习树有助于学习递归思想以及栈.队列(后续细说),本文对树的结构.遍历算法以及Python实现做总结,以供复习拓展 树是连通的无环 ...
- 最短路径问题之广度优先算法BFS(C语言)
一.单源最短路径 (一)最短路径问题 "G港"是个物流集散中⼼,经常需要往各个城市运东⻄,怎么运送距离最近?--单源最短路径问题 各个城市之间也需要互相往来,相互之间怎么⾛距离最近 ...
- 深度优先算法(DFS)和广度优先算法(BFS)时间复杂度和空间复杂度计算精讲
现在我们设定任务为到山东菏泽曹县买牛逼,需要利用深度优先算法(DFS)和广度优先算法(BFS)在中国.省会.市.区县这张大的树中搜索到曹县,那么这个任务Goal就是找到曹县. 假如图的最大路径长度m和 ...
- 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...
- BFS广度优先算法, DFS深度优先算法,Python,队列实现,栈实现
来源:https://www.bilibili.com/video/BV1Ks411575U/?spm_id_from=333.788.videocard.0 BFS广度优先算法 graph = {& ...
- 刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java)
刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java) https://www.lanqiao.cn/problems/234/learning/ http://lx.lanqia ...
- 算法笔记 揭开广度优先遍历BFS的神秘面纱 HERODING的算法之路
揭开广度优先遍历BFS的神秘面纱 前言 1. 审题 1.1 树的BFS 1.2 图的BFS 2. 解法 2.1 树的BFS 2.2 图的BFS 3. 总结 前言 最近到了面试的高峰时期,前段时间也刷了 ...
- Java数据结构之图的基本概念和算法,深度优先遍历DFS,广度优先遍历BFS(图解)
文章目录 前言 一.图的基本概念 1.图的定义 2.基本术语 二.图的基本算法 1.初始化图 2.插入顶点和边 3.矩阵打印 4.返回第一个邻接结点的下标 5.返回第一个邻接结点的下一个结点的下标 三 ...
最新文章
- 剑指offer:面试题34. 二叉树中和为某一值的路径
- Tkinter的事件绑定
- 自动化Debias框架,一键去除推荐系统所有Bias
- 分析mrp主要应用范围_华珀聚脲丨聚脲的主要应用范围
- if...else..的错误用法
- tortoisegit图标消失_TortoiseGit文件夹和文件图标不显示解决方法
- 【转载】VMware vSphere中三种磁盘规格的解释说明
- 利用CSkin组件设计漂亮的WinForm登录界面
- DEM数据局部修改高程
- TOM邮箱容量满了收发不了邮件?你应该快速做到这些事
- 魔兽、星际、红警的经典对比
- Macchanger-更改mac地址
- iMX6UL开发板移植libcurl库
- RT_thread空闲线程及两个常用的钩子函数
- 计算机实训安全教育,暑期实践 | 计算机学院举行暑期社会实践动员暨安全教育大会...
- 武林高手?敏捷开发,唯velocity取胜
- [LQR简要快速入门]+[一级倒立摆的LQR控制]
- MLAPP————第十三章 稀疏线性模型
- 科技圈最具权势25大女工程师
- i.MX6ULL驱动开发 | 24 - 基于platform平台驱动模型点亮LED