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广度优先搜索的实现与实践,记得点赞关注!

最新文章

  1. Windows Live Writer代码插件整理
  2. MariaDB 多主一从 搭建测试
  3. CSS中的margin、border、padding区别
  4. EXTJS 6 必填项加星号*
  5. 使用Matrix控制图片和组件的变化
  6. Golang学习 - sort 包
  7. lintcode :Ugly Numbers 丑数
  8. mysql:通用查询日志general_log
  9. ubuntu svn安装测试
  10. cocos2D-x 3.5 引擎解析之--引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)
  11. 关与 Visual.Assist.X.V10.7.1912的Crack破解补丁(vs 番茄插件的key破解方法)
  12. golang 详解defer
  13. tyflow车撞墙测试
  14. top 自动执行的shell脚本中,使用top -n 1 > log.txt, 上电自动执行,文件无输出
  15. C语言程序设计II—第七周教学
  16. lombok使用说明
  17. 深入解析Java AtomicInteger原子类型
  18. pure框架
  19. 解决RMI 客户端异常no security manager: RMI class loader disabled
  20. [Python爬虫] 之七:selenium webdriver定位不到元素的五种原因及解决办法(转载)

热门文章

  1. Portswigger web security academy:DOM Based XSS
  2. Webpack5构建速度提升令人惊叹,早升级早受益
  3. MySQL查看及杀掉链接方法大全
  4. (转)如何优雅的使用rabbit mq
  5. 发布声明$\beta$
  6. 面试遇到的坑CSS篇 1
  7. (原创)高DPI适配经验系列:(三)字体与字号、缩放锚点
  8. java基础——参数的应用
  9. 【转载】Windows 10系统默认将画面显示比例调整至125%或150%,最高分辨率已经达到3840×2160(4K)这一级别。
  10. 记一次 .NET 某电商交易平台Web站 CPU爆高分析