一、前言

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

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

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

二、区别

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

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

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

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

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

BFS示意图:

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

DFS示意图:

三、总结

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

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

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

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

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

最后再送大家一本,帮助我拿到 BAT 等一线大厂 offer 的数据结构刷题笔记,是一位 Google 大神写的,对于算法薄弱或者需要提高的同学都十分受用:

谷歌和阿里大佬的Leetcode刷题笔记

以及我整理的 BAT 算法工程师学习路线,书籍+视频,完整的学习路线和说明,对于想成为算法工程师的,绝对能有所帮助(提取码:jack):

我是如何成为算法工程师的,超详细的学习路线

别光收藏,来个赞哦,笔芯~

熬夜怒肝,图解算法!BFS和DFS的直观解释相关推荐

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

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

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

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

  3. 拓扑排序【Kahn算法(bfs)和dfs求拓扑序列及判环】

    拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,该排序满足这样的条件--对于图中的任意两个结点u和v,若存在一条有 ...

  4. 熬夜怒肝,保姆级Python学习路线,起飞!

    想当初女朋友编程小白零基础,到如今在互联网大厂做算法工作,就是我带她漂进Python的海洋,从此一去不复返~ 我给她制订的学习路线十分适合萌新,总共分三步: 看视频 作项目 啃厚书 看视频 如果是零基 ...

  5. (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)

    链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构   队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...

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

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

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

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

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

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

  9. Python BFS和DFS算法

    Python BFS和DFS算法 看了b站灯神的视频,整理如下.最后再加上几条实战题. 1.BFS bfs全称是广度优先搜索,任选一个点作为起始点,然后选择和其直接相连的(按顺序展开)走下去.主要用队 ...

最新文章

  1. 用户体验设计常犯10个逻辑谬误
  2. java treeset 删除_删除Java TreeSet中的最高元素
  3. Java基础部分笔记----------网络编程
  4. python怎么避免浅拷贝_深度解读Python深拷贝与浅拷贝问题
  5. 运动会管理系统php,运动会管理系统源代码.doc
  6. 人类信息接收过去、现在与未来 ——我对于内容产业的判断
  7. 摘: cmd环境 使用一点知识
  8. js字符串的字典序_27. 字符串的排列
  9. C/C++——各种类型int、long、double、char表示范围(最大最小值)
  10. ZAB协议(ZooKeeper Atomic Broadcast)入门
  11. 按位运算操作符底层实现原理
  12. win10 修改进入 cmd 命令行的默认路径
  13. 二元二次方程例题_二元二次方程练习题.doc
  14. c语言程序设计题目湖南大学,湖南大学C语言期末考试样卷
  15. 实现内网穿透,个人电脑秒变服务器
  16. 十年弄潮 ——从《才富》到《中国人力知本》
  17. 《外星人入侵》 教程详解
  18. JavaAPI操作Hive
  19. Python轮子网站及使用方法
  20. 你了解V神吗?先吃透这份不能更全的《以太坊攻略》再说!

热门文章

  1. linux无盘win7系统下载,顺网雲无盘客户机镜像下载链接
  2. MacBook自动获取DNS
  3. Destroy无法删除对象
  4. Kotlin 之类和接口
  5. linux实现复制文件的两种方法
  6. HTML 获取屏幕、浏览器、页面的高度宽度
  7. 一个月过软考|软件设计师中级考试经验分享
  8. java进销存管理系统_java swing开发进销存管理系统
  9. 电话格式 php,php中ip地址 email格式 电话号码正则验证
  10. 面试必备:聊聊sql优化的15个小技巧