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

 

posted @ 2021-06-14 16:31  球君  阅读(139)  评论(0编辑  收藏  举报
View Code