zoukankan      html  css  js  c++  java
  • 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广度优先搜索的实现与实践,记得点赞关注!

  • 相关阅读:
    状压DP
    string
    hdu3068
    HDU Stealing Harry Potter's Precious(状压BFS)
    状压BFS
    BFS+打印路径
    poj Meteor Shower
    C语言-无符号数与有符号数不为人知的秘密
    keras_实现cnn_手写数字识别
    python_plot画图参数设置
  • 原文地址:https://www.cnblogs.com/qj-Network-Box/p/14878963.html
Copyright © 2011-2022 走看看