算法基础:BFS和DFS的直观解释

https://cuijiahua.com/blog/2018/01/alogrithm_10.html

一、前言

我们首次接触 BFS 和 DFS 时,应该是在数据结构课上讲的 “图的遍历”。还有就是刷题的时候,遍历二叉树我们会经常用到BFS和DFS。它们的实现都很简单,这里我就不哆嗦去贴代码了。

想看代码的可以看《剑指Offer(三十八):二叉树的深度》这个题目就可以利用BFS和DFS进行求解。那么,这两者“遍历” 的序列到底有何差别?

本篇文章就单纯来讲讲它们的区别和各自的应用,不会涉及任何代码。我们以“图的遍历”为例,进行说明。

二、区别

广度优先搜索算法(Breadth-First-Search,缩写为 BFS),是一种利用队列实现的搜索算法。简单来说,其搜索过程和 “湖面丢进一块石头激起层层涟漪” 类似。

深度优先搜索算法(Depth-First-Search,缩写为 DFS),是一种利用递归实现的搜索算法。简单来说,其搜索过程和 “不撞南墙不回头” 类似。

BFS 的重点在于队列,而 DFS 的重点在于递归。这是它们的本质区别。

举个典型例子,如下图,灰色代表墙壁,绿色代表起点,红色代表终点,规定每次只能走一步,且只能往下或右走。求一条绿色到红色的最短路径。

对于上面的问题,BFS 和 DFS 都可以求出结果,它们的区别就是在复杂度上存在差异。我可以先告诉你,该题 BFS 是较佳算法。

BFS示意图:

如上图所示,从起点出发,对于每次出队列的点,都要遍历其四周的点。所以说 BFS 的搜索过程和 “湖面丢进一块石头激起层层涟漪” 很相似,此即 “广度优先搜索算法” 中“广度”的由来。

DFS示意图:

如上图所示,从起点出发,先把一个方向的点都遍历完才会改变方向...... 所以说,DFS 的搜索过程和 “不撞南墙不回头” 很相似,此即 “深度优先搜索算法” 中“深度”的由来。

三、总结

现在,你不妨对照着图,再去看看你打印出的遍历序列,是不是一目了然呢?

最后再说下它们的应用方向。

BFS 常用于找单一的最短路线,它的特点是 "搜到就是最优解",而 DFS 用于找所有解的问题,它的空间效率高,而且找到的不一定是最优解,必须记录并完成整个搜索,故一般情况下,深搜需要非常高效的剪枝(剪枝的概念请百度)。

PS:BFS 和 DFS 是很重要的算法,读者如果想要更深入地了解它们,建议去 OJ 或 Leetcode 上找一些相关赛题训练下,一定会给你一个别样的天地。

转载于:https://www.cnblogs.com/kungfupanda/p/11248014.html

算法基础:BFS和DFS的直观解释相关推荐

  1. 熬夜怒肝,图解算法!BFS和DFS的直观解释

    一.前言 我们首次接触 BFS 和 DFS 时,应该是在数据结构课上讲的 "图的遍历".还有就是刷题的时候,遍历二叉树我们会经常用到BFS和DFS.它们的实现都很简单,这里我就不哆 ...

  2. 图论算法基础-BFS与DFS

    注意,这两种算法是图论的基础,很多后续算法都是建立与两者之上,话不多说,让我们进入正题. 宽度优先搜索 思想:假设某个点为图的根节点,把图想象成一颗倒过来的树,每层每层的向下进行搜索,直到遇见正确的结 ...

  3. 安琪拉教鲁班学算法之BFS和DFS

    安琪拉教鲁班学算法之BFS和DFS <安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 <安琪拉教鲁班学算法 ...

  4. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  5. 寻路算法(BFS,DFS, A*寻路)

    博主真的有段时间没写博客了,主要这段时间在练内功(算法和数据结构),因此就没有写博客了.这次用两个小时写出了寻路算法,算是对之前博主学习进程的一个交待吧. 我们回归正题,BFS和DFS是我们遍历链表树 ...

  6. (五)算法与数据结构 | BFS和DFS

    文章目录 0. 简介 1. 广度优先搜索 2. 深度优先搜索 3. 总结 0. 简介 广度优先搜索(BreadthFirstSearch,BFS{\rm Breadth\ First\ Search, ...

  7. 无人车路径规划算法—(3)基于搜索的路径规划算法 (BFS/DFS/Dijkstra)

    1.BFS(广度优先搜索) && DFS(深度优先搜索) 广度优先遍历图的方式为,一次性访问当前顶点的所有未访问状态相邻顶点,并依次对每个相邻顶点执行同样处理.因为要依次对每个相邻顶点 ...

  8. 记录两种搜索遍历算法——BFS和DFS

    " 你所有流过的泪,是一条渡你的河, 你所有受过的苦,将照亮你前方的路:岁月从没有放过我们,我们也不能辜负岁月." 最近过的不好~ 被虐 自信全无 各种害怕.自卑~ 唯有努力前行, ...

  9. 图的两种遍历算法——BFS和DFS

    一.BFS,也称广度优先搜索,和二叉树的层次遍历算法类似 //BFS bool visited[MaxVertexNum]; void BFSTraverse(Graph G){for(i=0;i&l ...

  10. 2023牛客寒假算法基础集训营1_20230116「典dp」「典set」「小思维+bfs」「小思维+构造+码力」「位运算博弈(人类智慧)」

    6/13 打得不好,这两天家里也很不好,跟做梦一样,脑子好像被僵尸吃掉了,前两个小时胡乱瞎写交题只过样例,wa了再看,什么b错都能写出来. M. M-本题主要考察了找规律_2023牛客寒假算法基础集训 ...

最新文章

  1. NameNode中几个关键的数据结构
  2. AI 图像傅里叶变换
  3. Yii中的CComponent应用实例
  4. Zuul 查看所有路由路径与filter(过滤器)
  5. 一段H264数据的分析
  6. Disable anchor tag的javascript代码(兼容IE和Firefox)
  7. java并查集找朋友圈_图—并查集(解决朋友圈问题)
  8. mysql gtid 主键冲突_数据库开启gtid时,需要注意的问题
  9. cmd模式下如何从c盘转换到其他盘
  10. v-show组件 vue_Vue.js教程--基础(实例 模版语法template computed, watch v-if, v-show v-for, 一个组件的v-for.)...
  11. v8go 库手动编译 v8 golang 库手动编译
  12. 维克多DBC文件结构
  13. 全国省市区 mysql_2017全国省市区数据库【含三款数据库】
  14. 计算机网络安全知识讲座新闻稿,我院开展网络安全与信息化建设讲座
  15. 打印机经常遇到的一些问题
  16. 计算机开模拟器,低配电脑如何强制开50个安卓模拟器挂机
  17. ORcad Capture CIS元件库管理
  18. 小知识 | Java中的“魔数”
  19. c语言指针什么时候加星号,c语言中指针前面的星号,什么时候可以省去,什么时候又必须带上呢?(转载)...
  20. fossid安装教程_源代码怎么使用,源代码生成app教程

热门文章

  1. ssh:could not resolve hostname XXX:Temporary failure in name resolution
  2. java版spring cloud+spring boot+redis多租户社交电子商务平 (三)SpringBoot用JdbcTemplates访问Mysql...
  3. Confluence 6 教程:在 Confluence 中导航
  4. 51nod 1273 旅行计划——思维题
  5. WebService究竟是什么?
  6. Oracle教程之管理UNDO(九)--如何解决Oracle ORA-01555错误
  7. 写给初学asp.net的新人们 新手学习经验
  8. 请问mysql优化相关
  9. DAC+DMA+TIM实现音频播放问题记录
  10. node.js http-server 搭建本地服务器