深度优先遍历(DFS)和广度优先遍历(BFS)

2023-11-11


深度优先遍历简称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)(借用了堆栈或队列)
  • 时间复杂度只与存储结构有关,而与搜索路径无关。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度优先遍历(DFS)和广度优先遍历(BFS) 的相关文章

随机推荐

  • 图像边缘检测

    文章目录 前言 一 图像边缘检测 二 边缘检测算子 1 Roberts算子 2 Prewitt算子 3 Sobel算子 三 代码实现 总结 前言 有了图像放大缩小 图像灰度化处理等相关基础知识过后 就可以进行图像边缘检测了 边缘检测最后也会
  • 全屋智能家居搭建初级指南(装修用户)

    环境 小M等智能设备 新装修用户 稳定网络环境 规划好电路布局 问题描述 全屋智能家居如何搭建 初级指南 装修用户 下面部分内容摘自小M智能家居 解决方案 一 装修中需要注意什么 句话概括 需在水电进场前考虑智能家居设计 主要准备两件事 铺
  • jdbc,jpa,springjdbc,springdatajpa,mybatis之间的区别

    jdbc jdbc是Java提供的原生态接口 操作数据库的唯一技术 缺点 重复写代码 代码写死 耦合性高 开发效率低换数据库比较苦难 优点 运行速度最快 所有操作数据库的技术底层都是jdbc写的 jpa java persistence a
  • 汉诺塔(Hanoi)理解(递归函数)

    1 编程求解汉诺塔问题 汉诺塔 Hanoi 是必须用递归方法才能解决的经典问题 它来自于印度神话 上帝创造世界时作了三根金刚石柱子 在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘 如图7 3所示 上帝命令婆罗门把圆盘从下面开始按大小顺序
  • Postman使用Get请求和Post请求

    今天写了很多新活动接口文档 然后使用了Postman 主要总结一下postman的用法 1 Get请求 对应你方法中的getmapping 这种方法只要把参数拼上去就可以了 拼参数有两种格式 A在 中放入的参数 PathVariable 直
  • 业务架构·应用架构·数据架构实战~TOGAF理论全景解读

    1 解读TOGAF 9 2的BA DA AA TA内容模型 企业架构 Enterprise Architecture 包含如下四种架构 BA Business Architecture 业务架构 DA Data Architecture 数
  • 使用Linux脚本更新Weblogic部署的应用程序

    在利用Jenkins实现Weblogic应用自动部署的功能时 如何通过Shell 脚本自动更新Weblogic部署的应用程序呢 可以使用weblogic jar包中的weblogic Deployer这个class 命令如下 java we
  • 移动电源/充电管理设计

    移动电源 充电管理设计 简述 伴随着智能手机的兴起 智能手机的续航成了较大的问题 因此移动电源 充电宝 成为不时之需 而近来的各类无线耳机的兴起 无线耳机的续航又成为新的问题 为此针对无线耳机充电的各大厂商又一次成为热门 而这些都需要类似于
  • Windows11如何使用安卓子系统的Amazon Appstore

    这个月更新了Windows11以后 已经可以在微软应用商店下载安卓子系统并且安装安卓应用了 但是安卓子系统默认使用的是亚马逊的Amazon Appstore 目前这个商店只限制在美国使用 如果直接打开的话会提示Amazon AppStore
  • python学习日记【13 - 面向对象三】

    面向对象三 继承简介 方法重写 super 多重继承 多态 属性和方法 继承简介 继承是面向对象三大特性之一 通过继承我们可以使一个类获取到其他类中的属性和方法 在定义类时 可以在类名后面的括号中指定当前类的父类 超类 基类 继承提高了类的
  • 拥抱你的zsh,Linux下速通zsh&oh-my-zsh配置(附常用插件&主题)

    zsh oh my zsh配置 为什么要使用zsh 功能强大插件 丰富酷炫的主题 对bash完全兼容 这意味着与bash语法一致 功能更 健全 的Tab补全 代码高亮 相信你在阅读完本文以及用上zsh一段时间过后之后 可能并不需要很久 能对
  • 移动端适配方案之postcss-px-to-viewport

    之前做移动端适配时 基本上是采用rem方案 现在发现了一个新的方案 就是用viewport单位 现在viewport单位越来越受到众多浏览器的支持 postcss px to viewport 将px单位自动转换成viewport单位 用起
  • linux 消息队列状态:struct msqid_ds

    Linux的消息队列 queue 实质上是一个链表 它有消息队列标识符 queue ID msgget创建一个新队列或打开一个存在的队列 msgsnd向队列末端添加一条新消息 msgrcv从队列中取消息 取消息是不一定遵循先进先出的 也可以
  • 斐波那契数列应用——有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

    以下一道常见的关于斐波那契数列的算法题 发现python的解法比较少 特此分享一下 首先从题目分析 得出以下结论 1 最初一对兔子是一公和一母 2 兔子三个月就能生育 3 后续生下来的兔子很标准的一夫一妻制 但是有近亲繁殖的问题 细思极恐
  • 最好用的五个黑科技搜索引擎推荐

    一 数据搜 http data chongbuluo com 数据搜 这个网站就是搜索一些热词和数据指数的 包括百度指数 阿里指数 微博指数 微信指数 搜狗指数等等 当然 还有一些汽车数据 腾讯大数据 票房数据相关数据查询网站 估计很多人经
  • 多输入多输出

    多输入多输出 MATLAB实现CNN LSTM卷积长短期记忆神经网络多输入多输出 目录 多输入多输出 MATLAB实现CNN LSTM卷积长短期记忆神经网络多输入多输出 预测效果 基本介绍 程序设计 往期精彩 参考资料 预测效果 基本介绍
  • H.264 入门篇 - 10 (帧间预测 - 参考帧列表修改/重排)

    目录 0 写在前面 1 参考帧列表修改 重排 1 1 短期参考帧的修改 1 1 1 计算 picNumLXPred 1 1 2 计算 picNumLXNoWrap 1 1 3 计算 picNumLX 1 1 4 修改参考帧列表 1 2 长期
  • redis与memcache区别

    一 redis与memcache总体对比 1 性能 Redis 只使用单核 平均每一个核上Redis在存储小数据时比Memcached性能更高 Memcached 可以使用多核 而在100k以上的数据中 Memcached性能要高于Redi
  • 开源程序识别图像像素点_开源浏览器扩展程序,可放大图像

    开源程序识别图像像素点 您是否曾经浏览过网站并希望看到更大的图像 这无时无刻不在我身上发生 要做到这一点并不总是那么容易 有时 我在源代码中进行筛选 使用Ctrl F搜索图像 复制图像源地址并将其粘贴到新窗口中 以便以全尺寸查看图像 或者
  • 深度优先遍历(DFS)和广度优先遍历(BFS)

    深度优先遍历和广度优先遍历 1 深度优先遍历 DFS 2 广度优先遍历 BFS 3 DFS与BFS算法比较 深度优先遍历简称DFS Depth First Search 广度优先遍历简称BFS Breadth First Search 它们