数据结构与算法--图的深度优先搜索 (DFS)

2023-10-26

        深度优先搜索即是 从起点出发,从规定的方向中选择一个不断往前走,走到头为止,然后尝试另一种方向直到最后的终点。

DFS解决的是连通性问题,即从A是否能到达B。 采用DFS进行遍历的话,必须依赖栈,后进先出。 

        

假设有一个图,里面有ABCDEFGH 8 个顶点,对这个图进行深度优先的遍历

第一步 选择一个起始顶点,例如从顶点 A 开始。把 A 压入栈,标记它为访问过(用红色标记),并输出到结果中。

 

第二步 寻找与 A 相连并且还没有被访问过的顶点,顶点 A BDG 相连,而且它们都还没有被访问过,我们按照字母顺序处理,所以将 B 压入栈,标记它为访问过,并输出到结果中。

 

第三步 现在我们在顶点 B 上,重复上面的操作,由于 B AEF 相连,如果按照字母顺序处理的话,A 应该是要被访问的,但是 A 已经被访问了,所以我们访问顶点 E,将 E 压入栈,标记它为访问过,并输出到结果中。

 

第四步 E 开始, E B G 相连,但是 B 刚刚被访问过了,所以下一个被访问的将是 G ,把 G 压入栈,标记它为访问过,并输出到结果中。

第五步 现在我们在顶点 G 的位置,由于与 G 相连的顶点都被访问过,所以我们这里要做的就是将 G 从栈里弹出,表示我们从 G 这里已经无法继续走下去了,看看能不能从前一个路口找到出路。
如果发现周围的顶点都被访问了,就把当前的顶点弹出。
第六步 现在栈的顶部记录的是顶点 E ,我们来看看与 E 相连的顶点中有没有还没被访问到的,发现它们都被访问了,所以把 E 也弹出去

第七步 当前栈的顶点是 B ,看看它周围有没有还没被访问的顶点,有,是顶点 F ,于是把 F 压入栈,标记它为访问过,并输出到结果中。

第八步  当前顶点是 F ,与 F 相连并且还未被访问到的点是 C D ,按照字母顺序来,下一个被访问的点是 C ,将 C 压入栈,标记为访问过,输出到结果中。

第九步 当前顶点为 C ,与 C 相连并尚未被访问到的顶点是 H ,将 H 压入栈,标记为访问过,输出到结果中。

第十步 当前顶点是 H,由于和它相连的点都被访问过了,将它弹出栈。

第十一步 当前顶点是 C ,与 C 相连的点都被访问过了,将 C 弹出栈。

 

第十二步 当前顶点是 F ,与 F 相连的并且尚未访问的点是 D ,将 D 压入栈,输出到结果中,并标记为访问过。

第十三步 当前顶点是 D ,与它相连的点都被访问过了,将它弹出栈。以此类推,顶点 F B A 的邻居都被访问过了,将它们依次弹出栈就好了。最后,当栈里已经没有顶点需要处理了,我们的整个遍历结束。

 

时间复杂度
        
采用邻接表方式实现
访问所有顶点的时间为 O(V) ,而查找所有顶点的邻居一共需要 O(E) 的时间,所以总的时间复杂度是O(V + E)。
采用邻接矩阵方式实现
查找每个顶点的邻居需要 O(V) 的时间,所以查找整个矩阵的时候需要 O(V^2) 的时间
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法--图的深度优先搜索 (DFS) 的相关文章

随机推荐

  • java中注解的学习

    java 注解 从名字上看是注释 解释 但功能却不仅仅是注释那么简单 注解 Annotation 为我们在代码中添加信息提供了一种形式化的方法 是我们可以在稍后 某个时刻方便地使用这些数据 通过 解析注解 来使用这些数据 常见的作用有以下几
  • js中事件处理函数的总结

    1 HTML事件处理 直接添加到HTML结构中 不过这样的不利于保证HTML页面和JS的分离 不推介 demo 2 DOM 0级事件处理函数 把一个函数赋值给事件处理程序属性 js与页面分离的方法 但是不能够进行叠加 也就是对同一个Elem
  • nginx输出php错误日志,【问题解决】Nginx下开启php-fpm 输出php错误日志的设置

    最近在本地搭建的LNMP的开发环境 为了开发的时候不影响前端的正常开发就屏蔽的PHP里面php ini中的一些错误提示 但是这样一来 就影响到了后端开发的一些问题比如不能及时调试开发中的一些问题 nginx与apache不一样 在apach
  • 十八、搜索引擎

    搜索引擎ElasticSearch Lucene
  • 【bug】ImportError: cannot import name ‘_DataLoaderIter‘ from ‘torch.utils.data.dataloader‘

    pytorch版本的问题 架构本身的版本与实际的cuda环境以及想要跑通的代码不兼容 我遇到的问题是将pytorch版本降低 降到torch 1 0版本 对应的cuda环境也比较低 需要去网上对应着查一下cuda版本以及对应的pytorch
  • 基于JavaWeb三层架构的OA管理系统

    本系统是一个类似于培训学校的一个管理系统 系统角色有员工 学生 首页 它的左侧是后台管理系统的功能界面 右侧是前面的通过数据库查询的一个月或者是一年的统计信息 下面柱状图个折线图采用的是echarts架包通过数据库的信息实现的 都可以动态的
  • 全国计算机等级考试题库二级C操作题100套(第84套)

    第84套 函数fun的功能是 从三个形参a b c中找出中间的那个数 作为函数值返 回 例如 当a 3 b 5 c 4时 中数为4 请在程序的下划线处填入正确的内容并把下划线删除 使程序得出正确的结果 注意 源程序存放在考生文件夹下的BLA
  • 软件工程使用软件和软件所能画的图

    迅捷 业务流程图 软件结构图 功能框图 数据字典 序列图 用例图 Visio 业务流程图 软件结构图 功能框图 数据流图 数据字典 序列图 uml 用例图 类图 序列图 活动图 数据流图 Rose 用例图 包图 活动图 序列图 协作图 带有
  • 【测试开发】自动化测试 selenium 篇

    目录 一 什么是自动化测试 二 selenium 1 selenium的工作原理 2 selenium Java的环境搭建 Chrome浏览器 三 selenium中常用的API 1 定位元素 findElement 1 1 css选择语法
  • redis之mq实现发布订阅模式

    示例代码 github 概述 Redis不仅可作为缓存服务器 还可用作消息队列 本示例演示如何使用redis实现发布 订阅消息队列 在Redis中 发布者没有将消息发送给特定订阅者的程序 相反 发布的消息被描述为通道 而不知道 如果有的话
  • 分享Figma一些非常快速、省时、省力的功能和小技巧

    众所周知 越来越多的大工厂正在使用它figma了 那你的figma它是如何使用的 您是否遇到过一些问题或操作不方便的事情 今天 我想和大家分享Figma一些非常快速 省时 省力的功能和小技巧 因为文章属于直译 所以良心哥在编辑时帮你整理知识
  • [系统安全] 五十一.恶意家族分类 (2)基于API序列和深度学习的恶意家族分类实例详解

    您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意代码检测 系统安全 系列文章会更
  • 反馈及运放基础了解

    在电子电路中 将输出量 输出电压或输出电流 的一部分或全部通过一定的电路形式作用于输入回路 用来影响其输入量 放电电路的输入电压或输入电流 的措施称为反馈 基本放大电路的输入信号称为净输入量 它不但决定于输入信号 输入量 还与反馈信号 反馈
  • 将linux上的项目传到github上

    在网友的帮助下 终于学会了这一招 1 首先要确定你的linux上有安装了git 2 到你的网页github上新建一个仓库 将其clone到linux上 3 将你的项目放进这个空的仓库 文件夹 3 1 执行命令 git add 4 执行命令
  • 日语动作变形

    动1动词 动2动词 动3动词 基本型 可以作为连体形 行 買 帰 飲 呼 書 食 起 寝 変 準 変 変 来 连用形 行 買 帰 飲 呼 書 食 起 寝 変 準 変 変 来 体 也就是连用形 词尾由 段变为 段加 行
  • 这一年,谢谢自己

    兜兜转转间 这个开局有些艰难的2020就已经过半了 这些日子 你过得还好吗 不管是努力抵抗病痛 还是奋力工作生活 其实一直以来 我们都在路上 摸爬滚打 艰难前行 我们总是在追寻 在求索 为了所爱的人 而默默付出努力 却仍时时觉得对不起他们
  • 基于R语言tidyverse包的数据分析实践

    目录 1 tidyverse包基础 1 0 下载使用tidyverse 1 1 数据清洗 1 1 1 提取数据 1 1 2 数据整理与采样 1 1 3 缺省值处理 1 1 4 重复值处理 1 1 5 异常值处理 1 2 数据预处理 1 2
  • 【bug】ClassCastException 同一个类为什么还会类转换异常?

    错误日志 2021 11 11 20 51 18 304 maomao 3896 nio 8081 exec 2 ERROR c maomao common GlobalExceptionHandler 79 java lang Class
  • Kafka的认证

    Kafka支持基于SSL和基于SASL的安全认证机制 基于SSL的认证主要是指Broker和客户端的双路认证 即客户端认证broker的证书 broker也认证客户端的证书 Kafka还支持通过SASL做客户端认证 SASL是提供认证和数据
  • 数据结构与算法--图的深度优先搜索 (DFS)

    深度优先搜索即是 从起点出发 从规定的方向中选择一个不断往前走 走到头为止 然后尝试另一种方向直到最后的终点 DFS解决的是连通性问题 即从A是否能到达B 采用DFS进行遍历的话 必须依赖栈 后进先出 假设有一个图 里面有A B C D E