熬夜怒肝,图解算法!BFS和DFS的直观解释
一、前言
我们首次接触 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的直观解释相关推荐
- 记录两种搜索遍历算法——BFS和DFS
" 你所有流过的泪,是一条渡你的河, 你所有受过的苦,将照亮你前方的路:岁月从没有放过我们,我们也不能辜负岁月." 最近过的不好~ 被虐 自信全无 各种害怕.自卑~ 唯有努力前行, ...
- 图的两种遍历算法——BFS和DFS
一.BFS,也称广度优先搜索,和二叉树的层次遍历算法类似 //BFS bool visited[MaxVertexNum]; void BFSTraverse(Graph G){for(i=0;i&l ...
- 拓扑排序【Kahn算法(bfs)和dfs求拓扑序列及判环】
拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,该排序满足这样的条件--对于图中的任意两个结点u和v,若存在一条有 ...
- 熬夜怒肝,保姆级Python学习路线,起飞!
想当初女朋友编程小白零基础,到如今在互联网大厂做算法工作,就是我带她漂进Python的海洋,从此一去不复返~ 我给她制订的学习路线十分适合萌新,总共分三步: 看视频 作项目 啃厚书 看视频 如果是零基 ...
- (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)
链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构 队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...
- 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)
数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...
- (五)算法与数据结构 | BFS和DFS
文章目录 0. 简介 1. 广度优先搜索 2. 深度优先搜索 3. 总结 0. 简介 广度优先搜索(BreadthFirstSearch,BFS{\rm Breadth\ First\ Search, ...
- 寻路算法(BFS,DFS, A*寻路)
博主真的有段时间没写博客了,主要这段时间在练内功(算法和数据结构),因此就没有写博客了.这次用两个小时写出了寻路算法,算是对之前博主学习进程的一个交待吧. 我们回归正题,BFS和DFS是我们遍历链表树 ...
- Python BFS和DFS算法
Python BFS和DFS算法 看了b站灯神的视频,整理如下.最后再加上几条实战题. 1.BFS bfs全称是广度优先搜索,任选一个点作为起始点,然后选择和其直接相连的(按顺序展开)走下去.主要用队 ...
最新文章
- 用户体验设计常犯10个逻辑谬误
- java treeset 删除_删除Java TreeSet中的最高元素
- Java基础部分笔记----------网络编程
- python怎么避免浅拷贝_深度解读Python深拷贝与浅拷贝问题
- 运动会管理系统php,运动会管理系统源代码.doc
- 人类信息接收过去、现在与未来 ——我对于内容产业的判断
- 摘: cmd环境 使用一点知识
- js字符串的字典序_27. 字符串的排列
- C/C++——各种类型int、long、double、char表示范围(最大最小值)
- ZAB协议(ZooKeeper Atomic Broadcast)入门
- 按位运算操作符底层实现原理
- win10 修改进入 cmd 命令行的默认路径
- 二元二次方程例题_二元二次方程练习题.doc
- c语言程序设计题目湖南大学,湖南大学C语言期末考试样卷
- 实现内网穿透,个人电脑秒变服务器
- 十年弄潮 ——从《才富》到《中国人力知本》
- 《外星人入侵》 教程详解
- JavaAPI操作Hive
- Python轮子网站及使用方法
- 你了解V神吗?先吃透这份不能更全的《以太坊攻略》再说!