0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想
dfs前置知识:
递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com)
dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 (cnblogs.com)
本讲前置知识:
队列:0基础学算法 第三弹 队列 - 球君 - 博客园 (cnblogs.com)
↑早期作品,慎用↑
我们在上一讲稍微说了一下关于深度优先搜索的常识,今天我们的主题是广度优先搜索
广度优先搜索,简称BFS,同dfs一样,属于十分常见的算法,也是最常用的搜索方法之一,由于思路和dfs完全不同,这也导致了它们在性质和作用上的不同,接下来,我们来结合上一讲的部分例子,说一说广度优先搜索的顺序与使用方法。
还记得这张图吗(2020/11/1的产物)

一、BFS的算法思想
在dfs中,由于我们会选择从原始节点沿一条搜索路线找到底部的节点,再从底部节点回溯到上一个节点继续看有没有更多可能,这书使用了递归
在bfs中,我们会在初始节点处开始往下寻找,找到它的所有子目录节点,再寻找它子目录下的所有子目录节点,从此达成遍历,请看以下过程
第一步要确定搜索起点,即原始节点,从这里开始搜索
从①往下找自然可以找到②
从①往下还可以找到⑩
目前我们对这张图的遍历顺序:①→②→⑩→③→⑦→⑧
搜索顺序追踪:①→②→⑩→③→⑦→⑧→④→⑤→⑨
最后从⑤找到了⑥,由于再也找不到任何一个了,此时所有节点都以找到,搜索结束
一般来讲,dfs会使用到递归,而bfs不需要,这和它的中心思想有关,dfs需要不断挖深,挖到底还需要往上爬,但根据刚刚bfs的搜索顺序图,不难看出bfs在到底后搜索就结束了,所以说bfs不需要用到递归,只需要用到普通的循环。
但是,怎样才能做到依次载入一个节点的每一个子节点,然后继续依次载入它的子节点的子节点呢?
二、队列实现BFS
队列是实现BFS最常用的方法,我个人比较喜欢使用c++标准模板库STL中的“队列”queue(stl队列介绍:见篇首)不过使用手打的队列也无伤大雅。
总的来说,原理就是载入初始节点,再将它的子节点全部载入,弹出他,从第一个子节点开始,载入子节点的子节点们,弹出子节点……
举了例子,有如下图

那么我们使用BFS时,队列里是什么情况呢
创建队列后压入头节点
压入头节点的子节点
弹出头节点
压入第一个子节点的所有子节点
如图
接下来重复以上操作,直到队列弹空


由于接下来的③⑦⑧⑤⑥均没有子节点了,所以搜索结束,所有节点完成遍历。
本期的内容差不多到这里就结束了,关于代码实现的问题,敬请期待下一期BFS广度优先搜索的实现与实践,记得点赞关注!
0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想的更多相关文章
- 0基础算法基础学算法 第八弹 递归进阶,dfs第一讲
最近很有一段时间没有更新了,主要是因为我要去参加一个重要的考试----小升初!作为一个武汉的兢兢业业的小学生当然要去试一试我们那里最好的几个学校的考试了,总之因为很多的原因放了好久的鸽子,不过从今天开 ...
- 步步为营(十六)搜索(二)BFS 广度优先搜索
上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起 ...
- 算法竞赛——BFS广度优先搜索
BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...
- 零基础学python》(第二版)
---恢复内容开始--- 零基础学python>(第二版) python学习手册 可以离线下载, .chn格式, 插入小幽默笑话,在学习累的时候看看笑话 放松一下 欢迎下载转载,请注明出处,谢 ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- 图的遍历BFS广度优先搜索
图的遍历BFS广度优先搜索 1. 简介 BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法在一个结点"死磕到底"的思维不同,广度优先 ...
- BFS广度优先搜索 poj1915
Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25909 Accepted: 12244 Descri ...
- 【从0到1学算法】大O表示法
一般我们在选择算法时,都是想要选择效率最高的算法.那算法的效率,用什么表示?没错!就是用大O表示法. PS: 大O表示法中,log即为log2,后面不再说明. 下面以简单查找和二分查找,在含有n个元素 ...
- GraphMatrix::BFS广度优先搜索
查找某一结点的邻居: virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点 virtual int nextNbr(int i, ...
随机推荐
- Windows Pe 第三章 PE头文件-EX-相关编程-2(RVA_FOA转换)
RVA-FOA之间转换 1.首先PE头加载到内存之后是和文件头内容一样的,就算是偏移不同,一个是磁盘扇区大小(400H)另一个是内存页大小(1000H),但是因为两个都是开头位置,所以相同. 2.看下 ...
- WPF中属性经动画处理后无法更改的问题
在WPF的Animation中,有一个属性为FillBehavior,用于指定时间线在其活动周期结束后但其父时间线仍处于活动周期或填充周期时的行为方式.如果希望动画在活动周期结束时保留其值,则将动画F ...
- 每天一道面试题LeetCode 26--删除排序数组中的重复项(python实现)
题目1:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...
- 【CSS】CSS3从入门到深入(复习查漏向
CSS3从入门到深入(复习查漏向 pre_section CSS:层叠样式表,决定网页表现 网页为多层结构,CSS为每一层设置样式,最后显示最上一层 CSS语句 = 选择器 + 声明块 形式 内联样式 ...
- Redis数据结构—链表与字典
目录 Redis数据结构-链表与字典 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 哈希算法 解决键冲突 rehas ...
- VS Code 远程开发
听说有人想用VS Code实现远程开发,今天他来了 Remote Development Always reveal the SSH login terminal, 还可加装免密登录,一键登录尽显奢华 ...
- OCR-Form-Tools项目试玩记录(一)本地部署
OCR-Form-Tools是微软的一个开源代码库,包含微软表单识别和OCR服务相关的多种工具.Github仓库地址 目前,表单标注工具(OCR Form Labeling Tool)是首个发布到本该 ...
- Spring Cloud Alibaba Nacos Config 实战
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持.使用 Spring Cloud Alibaba Nacos Config,您可 ...
- 驰骋CCFlow开源工作流程引擎如何设置PDF打印
前言 经常有驰骋CCFlow爱好者朋友提问关于打印相关问题.在这篇博文中大家介绍一下工作流引擎CCFlow的HTML打印和PDF打印,针对Java版本和.NET版本有不同的操作步骤,包括开关设置.水印 ...
- Zabbix 监控过程详解
Zabbix 监控过程详解 一.修改密码及中文语言 修改密码 修改中文语言 如果复选框中没有 Chinese(zh_CN) 选项,需要安装中文包 [root@Zabbix-server ~]# yum ...