博客
关于我
深度优先遍历(DFS)和广度优先遍历(BFS)
阅读量:324 次
发布时间:2019-03-04

本文共 1087 字,大约阅读时间需要 3 分钟。

深度优先遍历和广度优先遍历


深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth First Search),它们是遍历图当中所有顶点的两种方式。

1.深度优先遍历(DFS)

深度优先遍历顾名思义就是一条路走到黑,再寻其他未走过的路。其类似于树的先序遍历。

思想: 假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。显然,深度优先搜索是一个递归的过程。

方法:

  • 在访问图中某一起始顶点v后,由v出发,访问它的任一邻接顶点w1
  • 再从w1出发,访问与w1邻接但未被访问过的顶点w2
  • 然后再从w2出发,进行类似的访问
  • 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u为止
  • 接着,退回一步,退到前一次刚访问过的顶点,看是否还有其他没有被访问过的顶点
  • 如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问
  • 如果没有,就再退回一步进行搜索。重复上述过程,直至连通图中所有顶点都被访问过。

例子:
在这里插入图片描述
深度优先遍历上图为:

1.初始状态,从顶点1开始
2.依次访问过顶点2,3后,终止于顶点3
3.从顶点3回溯到顶点2,继续访问顶点5,并且终止于顶点5
4.从顶点5回溯到顶点2,并且终止于顶点2
5.从顶点2回溯到顶点1,并终止于顶点1
6.从顶点4开始访问,并终止于顶点4

像这样先深入探索,走到头再回退寻找其他出路的遍历方式,就叫做深度优先遍历(DFS)。

其实,二叉树的前序、中序、后序遍历,本质上也可以认为是深度优先遍历

时间复杂度:
在这里插入图片描述

2.广度优先遍历(BFS)

BFS类似于树的层次遍历。

方法: 从图的某一顶点出发,首先依次访问该顶点的所有邻接顶点,再按照这些顶点被访问的先后顺序依次访问与它们相邻接的所有未被访问的顶点;重复此过程,直至所有顶点均被访问为止。
在这里插入图片描述
在这里插入图片描述
时间复杂度:
1.如果使用邻接矩阵存储,则BFS对于每一个被访问到的顶点,都要循环检测矩阵中的整整一行(n个元素),故时间复杂度为O( n 2 n^2 n2)
2.如果使用邻接表存储,虽然有2e个表结点,但只需扫描e个结点即可完成遍历,加上访问n个头结点的时间,时间复杂度为O(n+e)

3.DFS与BFS算法比较

  • 空间复杂度相同,都是O(n)(借用了堆栈或队列)
  • 时间复杂度只与存储结构有关,而与搜索路径无关。

转载地址:http://cerh.baihongyu.com/

你可能感兴趣的文章
SaaS前世今生:老树开新花
查看>>
微信小程序生命周期 / 页面的生命周期 / 页面的用户行为
查看>>
用C语言散列表实现电话薄
查看>>
微信小程序云开发手机商城项目源码+数据库+云后台+部署 (毕业生福利!)
查看>>
Maven的配置
查看>>
如何在bilibili上下载学习视频?
查看>>
Python爬虫利器之Beautiful Soup的全世界最强用法 五百行文章!
查看>>
09-Vue之本地应用v-for指令
查看>>
03-selenium元素定位
查看>>
19-selenium操作已启动的浏览器
查看>>
11-Python-作用域和命名空间
查看>>
2020.2.13普及C组 罗密欧与朱丽叶的约会【纪中】【前缀和】
查看>>
纪中2020.3.4普及C组模拟赛总结
查看>>
纪中2020.3.18普及C组模拟赛总结
查看>>
YbtOJ 递推算法课堂过关 例5 平铺方案【递推(简单DP)】
查看>>
YbtOJ hash和hash表课堂过关 例1 字符串哈希【hash】
查看>>
YbtOJ hash和hash表课堂过关 例4 单词背诵【hash】【二分】
查看>>
CSUST 2021 周赛 2 题解
查看>>
【人脸识别】基于matlab GUI灰度化教室人数统计【含Matlab源码 602期】
查看>>
前后端数据交互之表单
查看>>