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广度优先搜索的思想的更多相关文章

  1. 0基础算法基础学算法 第八弹 递归进阶,dfs第一讲

    最近很有一段时间没有更新了,主要是因为我要去参加一个重要的考试----小升初!作为一个武汉的兢兢业业的小学生当然要去试一试我们那里最好的几个学校的考试了,总之因为很多的原因放了好久的鸽子,不过从今天开 ...

  2. 步步为营(十六)搜索(二)BFS 广度优先搜索

    上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起 ...

  3. 算法竞赛——BFS广度优先搜索

    BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...

  4. 零基础学python》(第二版)

    ---恢复内容开始--- 零基础学python>(第二版) python学习手册 可以离线下载,  .chn格式, 插入小幽默笑话,在学习累的时候看看笑话 放松一下 欢迎下载转载,请注明出处,谢 ...

  5. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  6. 图的遍历BFS广度优先搜索

    图的遍历BFS广度优先搜索 1. 简介 BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法在一个结点"死磕到底"的思维不同,广度优先 ...

  7. BFS广度优先搜索 poj1915

    Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25909 Accepted: 12244 Descri ...

  8. 【从0到1学算法】大O表示法

    一般我们在选择算法时,都是想要选择效率最高的算法.那算法的效率,用什么表示?没错!就是用大O表示法. PS: 大O表示法中,log即为log2,后面不再说明. 下面以简单查找和二分查找,在含有n个元素 ...

  9. GraphMatrix::BFS广度优先搜索

    查找某一结点的邻居: virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点 virtual int nextNbr(int i, ...

随机推荐

  1. Tomcat管理弱口令页面Getshell

    目录 弱口令Getshell 利用Burpsuite对tomcat账号密码进行爆破 弱口令Getshell Tomcat安装完成后会有如下页面,点击该页面的 Manager App 处会弹出输入用户名 ...

  2. Windows核心编程 第四章 进程(上)

    第4章 进 程     本章介绍系统如何管理所有正在运行的应用程序.首先讲述什么是进程,以及系统如何创建进程内核对象,以便管理每个进程.然后将说明如何使用相关的内核对象来对进程进行操作.接着,要介绍进 ...

  3. pr中打开Audition编辑剪辑?

    前景 现在一般的adobe全家桶都是一键安装破解. 天翼网盘链接,下载不限速,没有账号就现注册一个即可. https://cloud.189.cn/t/UZRjuqAZ3E7r (访问码:8ago) ...

  4. php防注入和XSS攻击通用过滤

    public function SafeFilter($arr){ $ra=Array('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/','/script/','/javas ...

  5. 基于texlive定制chemfig化学式转换Python服务镜像

    chemfig 据别人介绍,在绘制平面分子式,乃至化学反应式.机理图时,大家使用的基本都是ChemDraw.当然ChemDraw是一款强大的软件,无论是平面的还是立体的分子结构式都能毫不费力地绘制出来 ...

  6. Identity Server4 数据迁移、持久化

    add-migration InitialPersistedGrantDb -c PersistedGrantDbContext -o Migrations/IdentityServer/Persis ...

  7. HTML中的JavaScript

    HTML中的JavaScript 1.<script>元素 defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行.只对外部脚本文件有效. 脚本会被延迟到整个页面都解析完毕后再 ...

  8. 老板让我重构项目,我想首先应该服务治理---eureka服务治理深入浅出

    目录 什么是服务治理 Eureka调用过程 Eureka单机注册 Eureka 单机启动 单机注册 集群注册 客户调用 Eureka集群注册 idea 如何同一个项目启动多次 Eureka自我保护 为 ...

  9. 企业CRM系统选型的标准有哪些?

    随着市场的发展,企业开始意识到客户的重要性.越来越多的企业形成了"以客户为核心"的理念,更加注重客户数据和管理,因此CRM客户关系管理系统成为企业的首选.选择一个适合企业的CRM系 ...

  10. (五)Jira Api对接:修改任务状态

    项目迭代结束后我们需要把sprint下面的story.task任务状态修改到结束状态,如果手动修改会花费不少时间,本文就介绍如何通过jira api自动修改任务状态,提高工作效率. 一.查看任务工作流 ...