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, ...
随机推荐
- JavaScript 的入门学习案例,保证学会!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Web 服务器安全
目录 Apache Apache出现过的漏洞 Tomcat Tomcat出现过的漏洞 Nginx
- ajax提交session超时跳转页面使用全局的方法来处理
来自:http://www.jb51.net/article/43770.htm 如果是ajax提交,超时时从服务器发出的跳转命令就不会起作用,所以如果是session超时,而且是在ajax请求,就在 ...
- 前端Excel表格导入导出,包括合并单元格,表格自定义样式等
表格数据导入 读取导入Excel表格数据这里采用的是 xlsx 插件 npm i xlsx 读取excel需要通过 XLSX.read(data, {type: type}) 方法来实现,返回一个叫W ...
- 脱壳入门----常见的寻找OEP的方法
一步直达法 所谓的一步直达法就是利用壳的特征.壳一般在执行完壳代码之后需要跳转到OEP处,而这个跳转指令一般是call ,jmp ,push retn类型的指令,而且因为壳代码所在的区段和OEP代码所 ...
- lower_bound和upper_bound的实现
int lowerBound(int* nums, int numsSize, int target) { //注意left和right的初始值必须是left = 0, right = numsSzi ...
- Morgan Stanley Books List:经典金融书籍推荐
一.经济学 1. 中华帝国的专制制度,佛朗索瓦.魁奈 2. 资本论(共3卷),马恩全集 3. 国家竞争优势,麦克尔.波特 4. Essentials of corporate analysis, by ...
- ES6对象的新增方法的使用
Object.assign Object Object.assign(target, ...sources) 将所有可枚举属性的值从一个或多个源对象复制到目标对象 参数: target 目标对象 so ...
- [bug] Shell:paths must precede expression
参考 https://www.cnblogs.com/peter1994/p/7297656.html
- [bug] kafka启动报错 could not be established. Broker may not be available.
原因 配置文件和命令行中的主机名不一致,建议都用ip地址 参考 https://blog.csdn.net/getyouwant/article/details/79000524