26考研——图_图的遍历(6)

news2025/3/28 17:51:37

408答疑


文章目录

  • 三、图的遍历
    • 图的遍历概述
      • 图的遍历算法的重要性
      • 图的遍历与树的遍历的区别
      • 图的遍历过程中的注意事项
        • 避免重复访问
        • 遍历算法的分类
        • 遍历结果的不唯一性
    • 广度优先搜索
      • 广度优先搜索(BFS)概述
      • BFS 的特点
      • 广度优先遍历的过程
        • 示例图
        • 遍历过程
      • BFS 算法的性能分析
        • 基于邻接表存储的 BFS 的效率
      • BFS 算法求解单源最短路径问题
      • 广度优先生成树
    • 深度优先搜索
      • 深度优先搜索(DFS)概述
      • 深度优先遍历的过程
        • 示例图
        • 遍历过程
      • DFS 算法的性能分析
      • 深度优先的生成树和生成森林
    • 注意事项
    • 图的遍历与图的连通性
  • 六、参考资料
    • 鲍鱼科技课件
    • 26王道考研书


三、图的遍历

图的遍历概述

图的遍历是指从图中的某一项点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次,且仅访问一次。
注意到树是一种特殊的图,所以树的遍历实际上也可视为一种特殊的图的遍历。

图的遍历算法的重要性

图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。

图的遍历与树的遍历的区别

图的遍历比树的遍历要复杂得多,因为图的任意一个顶点都可能和其余的顶点相邻接,所以在访问某个顶点后,可能沿着某条路径搜索又回到该顶点。

图的遍历过程中的注意事项

避免重复访问

为避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点,为此可以设一个辅助数组 visited[] 来标记顶点是否被访问过。

遍历算法的分类

图的遍历算法主要有两种:

  • 广度优先搜索(BFS)
  • 深度优先搜索(DFS)
遍历结果的不唯一性

图的遍历结果顺序是不唯一的,跟选择的起始结点和所求邻接结点的顺序有关。

广度优先搜索

广度优先搜索(BFS)概述

广度优先搜索(Breadth-First-Search, BFS)类似于二叉树的层次遍历算法。基本思想是:首先访问起始顶点 v v v,接着由 v v v 出发,依次访问 v v v 的各个未访问过的邻接顶点 w 1 , w 2 , ⋯   , w r w_1, w_2, \cdots, w_r w1,w2,,wr,然后依次访问 w 1 , w 2 , ⋯   , w r w_1, w_2, \cdots, w_r w1,w2,,wr 的所有未被访问过的邻接顶点;再从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点,直至图中所有顶点都被访问过为止。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为始点,重复上述过程,直至图中所有顶点都被访问到为止。Dijkstra 单源最短路径算法和 Prim 最小生成树算法也应用了类似的思想。

BFS 的特点

广度优先搜索遍历图的过程是以 v v v 为起始点,由近至远依次访问和 v v v 有路径相通且路径长度为 1, 2, … 的顶点。广度优先搜索是一种分层的查找过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有往回退的情况,因此它不是一个递归的算法。为了实现逐层的访问,算法必须借助一个辅助队列,以记忆正在访问的顶点的下一层顶点。

广度优先遍历的过程

示例图

如下图所示,一个无向图 G G G
在这里插入图片描述

遍历过程

假设从顶点 a a a 开始访问, a a a 先入队。此时队列非空,取出队头元素 a a a,因为 b , c b, c b,c a a a 邻接且未被访问过,于是依次访问 b , c b, c b,c,并将 b , c b, c b,c 依次入队。队列非空,取出队头元素 b b b,依次访问与 b b b 邻接且未被访问的顶点 d , e d, e d,e,并将 d , e d, e d,e 入队(注意: a a a b b b 也邻接,但 a a a 已置访问标记,所以不再重复访问)。此时队列非空,取出队头元素 c c c,访问与 c c c 邻接且未被访问的顶点 f , g f, g f,g,并将 f , g f, g f,g 入队。此时,取出队头元素 d d d,但与 d d d 邻接且未被访问的顶点为空,所以不进行任何操作。继续取出队头元素 e e e,将 h h h 入队列……最终取出队头元素 h h h 后,队列为空,从而循环自动跳出。遍历结果为 a b c d e f g h abcdefgh abcdefgh

从上例不难看出,图的广度优先搜索的过程与二叉树的层次遍历是完全一致的,这也说明了图的广度优先搜索遍历算法是二叉树的层次遍历算法的扩展。

BFS 算法的性能分析

无论是邻接表还是邻接矩阵的存储方式,BFS 算法都需要借助一个辅助队列 Q Q Q n n n 个顶点均需入队一次,在最坏的情况下,空间复杂度为 O ( ∣ V ∣ ) O(|V|) O(V)

基于邻接表存储的 BFS 的效率

遍历图的过程实质上是对每个顶点查找其邻接点的过程,耗费的时间取决于所采用的存储结构。采用邻接表存储时,每个顶点均需搜索(或入队)一次,时间复杂度为 O ( ∣ V ∣ ) O(|V|) O(V),在搜索每个顶点的邻接点时,每条边至少访问一次,时间复杂度为 O ( ∣ E ∣ ) O(|E|) O(E),总的时间复杂度为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(V+E)。采用邻接矩阵存储时,查找每个顶点的邻接点所需的时间为 O ( ∣ V ∣ ) O(|V|) O(V),总时间复杂度为 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)

BFS 算法求解单源最短路径问题

若图 G = ( V , E ) G = (V, E) G=(V,E) 为非带权图,定义从顶点 u u u 到顶点 v v v 的最短路径 d ( u , v ) d(u, v) d(u,v) 为从 u u u v v v 的任何路径中最少的边数;若从 u u u v v v 没有通路,则 d ( u , v ) = ∞ d(u, v) = \infty d(u,v)=

使用 BFS,我们可以求解一个满足上述定义的非带权图的单源最短路径问题,这是由广度优先搜索总是按照距离由近到远来遍历图中每个顶点的性质决定的。

广度优先生成树

在广度遍历的过程中,我们可以得到一棵遍历树,称为广度优先生成树,如下图所示。
在这里插入图片描述

需要注意的是,同一个图的邻接矩阵存储表示是唯一的,所以其广度优先生成树也是唯一的,但因为邻接表存储表示不唯一,所以其广度优先生成树也是不唯一的。

深度优先搜索

深度优先搜索(DFS)概述

深度优先搜索(Depth-First-Search, DFS)是一种尽可能“深”地搜索图的算法。其基本思想如下:

  1. 借助临时空间:借助 n n n 个临时空间来标记结点是否被访问过。
  2. 访问顶点:首先访问图中的某一顶点 v v v,接着访问 v v v 的邻接顶点 w w w,访问 w w w 的下一邻接顶点,依次类推,重复上述过程。
  3. 回溯:当不能再继续向下访问顶点时,依次退回到最近被访问的顶点,如果还有其他邻接顶点没有被访问,则继续从该结点出发开始上述的遍历过程,直到图的所有结点被访问完为止。

深度优先遍历相当于二叉树中的前序遍历。

深度优先遍历的过程

示例图

如下图所示,一个无向图 G G G
在这里插入图片描述

遍历过程

深度优先搜索的过程如下:

  1. 首先访问 a a a,并置 a a a 访问标记。
  2. 然后访问与 a a a 邻接且未被访问的顶点 b b b,置 b b b 访问标记。
  3. 然后访问与 b b b 邻接且未被访问的顶点 d d d,置 d d d 访问标记。
  4. 此时 d d d 已没有未被访问过的邻接点,所以返回上一个访问的顶点 b b b,访问与其邻接且未被访问的顶点 e e e,置 e e e 访问标记,以此类推,直至图中所有顶点都被访问一次。遍历结果为 a b d e h c f g abdehcfg abdehcfg

DFS 算法的性能分析

DFS算法是一个递归算法,需要借助一个递归工作栈,所以其空间复杂度为 O ( ∣ V ∣ ) O(|V|) O(V)。遍历图的过程实质上是通过边查找邻接点的过程,因此两种遍历方式的时间复杂度都相同,不同之处仅在于对顶点访问顺序的不同。采用邻接矩阵存储时,总时间复杂度为 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)。采用邻接表存储时,总的时间复杂度为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(V+E)

深度优先的生成树和生成森林

与广度优先搜索一样,深度优先搜索也会产生一棵深度优先生成树。当然,这是有条件的,即对连通图调用DFS才能产生深度优先生成树,否则产生的将是深度优先生成森林,如下图所示。
在这里插入图片描述

与BFS类似,基于邻接表存储的深度优先生成树是不唯一的。

注意事项

图的邻接矩阵表示是唯一的,但对邻接表来说,若边的输入次序不同,则生成的邻接表也不同。因此,对同样一个图,基于邻接矩阵的遍历得到的 DFS 序列和 BFS 序列是唯一的,基于邻接表的遍历得到的 DFS 序列和 BFS 序列是不唯一的。

图的遍历与图的连通性

图的遍历法可以用来判断图的连通性。对于无向图来说,若无向图是连通的,则从任意一个结点出发,仅需一次遍历就能够访问图中的所有顶点;若无向图是非连通的,则从某一个顶点出发,一次遍历只能访问到该顶点所在连通分量的所有顶点,而对于图中其他连通分量的顶点,则无法通过这次遍历访问。对于有向图来说,若从初始顶点到图中的每个顶点都有路径,则能够访问到图中的所有顶点,否则不能访问到所有顶点。

因此,在BFSTraverse()或DFSTraverse()中添加了第二个for循环,再选取初始点,继续进行遍历,以防止一次无法遍历图的所有顶点。对于无向图,上述两个函数调用BFS(G, i)或DFS(G, i)的次数等于该图的连通分量数;而对于有向图则不是这样,因为一个连通的有向图分为强连通的和非强连通的,它的连通子图也分为强连通分量和非强连通分量,非强连通分量一次调用BFS(G, i)或DFS(G, i)无法访问到该连通分量的所有顶点,如下图所示。
在这里插入图片描述

六、参考资料

鲍鱼科技课件

b站免费王道课后题讲解: link
在这里插入图片描述

网课全程班: link
在这里插入图片描述

26王道考研书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++类与对象的第一个简单的实战练习-3.24笔记

在哔哩哔哩学习的这个老师的C面向对象高级语言程序设计教程&#xff08;118集全&#xff09;讲的真的很不错 实战一&#xff1a; 情况一&#xff1a;将所有代码写到一个文件main.cpp中 #include<iostream> //不知道包含strcpy的头文件名称是什么,问ai可知 #include<…

4.1 C#获取目录的3个方法的区别

C#中常用有如下3个获取目录的方式如下 1.Directory.GetCurrentDirectory():获取当前工作目录&#xff0c;工作目录可能被用户或其他代码修改。尽量少用。&#xff08;似乎只要在运行中使用另存为或者打开某个文件夹&#xff0c;当前工作目录就修改&#xff09; 2.Application…

oracle数据库(数据库启动关闭/sqlplus登录及基本操作/设置字符集/distinct去重)

目录 1. Oracle数据库启动 2. Oracle数据库关闭 3. sqlplus登录Oracle数据库 3.1 使用sqlplus登录Oracle数据库 3.2 使用sqlplus登录Oracle数据库 3.3 远程登录 3.4 解锁用户 3.5 修改用户密码 3.6 查看当前语言环境 4. sqlplus基本操作 4.1 显示当前用户 4.2 查看当前用户…

1、SpringBoot集成MyBatis

&#xff08;1&#xff09;创建SpringBoot项目 &#xff08;2&#xff09;集成MyBatis 导入坐标 <!-- 连接数据库&#xff0c;版本5 --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><versi…

Linux实操篇-权限管理

目录 传送门前言一、权限管理概念二、权限管理实战1. Linux文件权限模型1.1 文件的三种基本权限1.2 权限的三类主体 2. 查看文件权限3. 修改文件权限3.1 使用符号方式修改权限3.2 使用数字方式修改权限 4. 特殊权限4.1 SUID&#xff08;Set User ID&#xff09;4.2 SGID&#x…

阿里开源的免费数据集成工具——DataX

企业里真实的数据流转是什么样子的呢&#xff1f; 左侧描述了一个企业真实的样子&#xff0c;我们总是需要把数据从一个地方搬到另一个地方&#xff0c;最后就是搬来搬去搬成了一张张解不开的网。 右侧则表达了使用DataX为中心实现数据的同步。 什么是DataX DataX是一个异构…

【前端】使用 HTML、CSS 和 JavaScript 创建一个数字时钟和搜索功能的网页

文章目录 ⭐前言⭐一、项目结构⭐二、HTML 结构⭐三、CSS 样式⭐四、JavaScript 功能⭐五、运行效果⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#xff08;,NET/Java/Python/C&#xff09;、数…

地理信息可视化技术大全【WebGIS 教程一】

前言&#xff1a; 在当今数据驱动的时代&#xff0c;地理信息技术&#xff08;GIS&#xff09;和空间数据可视化已成为科学研究、商业决策和智慧城市建设的重要工具。随着Web技术的快速发展&#xff0c;基于浏览器端的地图渲染和地理信息处理能力显著增强&#xff0c;各类开源与…

SLAM十四讲【四】相机与图像

SLAM十四讲【四】相机与图像 SLAM十四讲【一】基本概念 SLAM十四讲【二】三维空间刚体运动 SLAM十四讲【三】李群与李代数 SLAM十四讲【四】相机与图像 SLAM十四讲【五】线性优化 SLAM十四讲【六】视觉里程计 SLAM十四讲【七】回环检测 SLAM十四讲【八】建图 文章目录 SLAM十四…

类和对象-运算符重载-C++

1.加号运算符重载 1.成员函数重载调用 函数的定义部分&#xff08;这里的person是返回值类型&#xff0c;不是说构造函数&#xff09; class person { public:person operator(person& p){person temp;temp.a this->a p.a;temp.b this->b p.b;return temp;}in…

2000-2019年各省地方财政耕地占用税数据

2000-2019年各省地方财政耕地占用税数据 1、时间&#xff1a;2000-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政耕地占用税 4、范围&#xff1a;31省 5、指标说明&#xff1a;耕地占用税是地方财政的一种税收&…

从零到一开发一款 DeepSeek 聊天机器人

AI聊天机器人 目标设计方案系统架构技术选型功能模块 实现代码环境配置安装依赖 核心代码API 请求函数主循环函数 功能扩展1. 情感分析2. 多语言支持3. 上下文记忆4. 用户身份识别 总结附录 目标 开发一个智能聊天机器人&#xff0c;旨在为用户提供自然、流畅的对话体验。通过…

S32K144外设实验(五):FTM周期中断

文章目录 1. 概述1.1 时钟系统1.2 实验目的 2. 代码的配置 1. 概述 1.1 时钟系统 FTM的CPU接口时钟为SYS_CLK&#xff0c;在RUN模式下最高80MHz。模块的时钟结构如下图所示。 从上图中可以看出&#xff0c;FTM模块的功能时钟为SYS_CLK&#xff0c;计数器的时钟源可以来源于三…

Android 静态壁纸设置实现方案

提示&#xff1a;Android 平台&#xff0c;静态壁纸实现方案 文章目录 需求&#xff1a;Android 实现壁纸 设置场景 参考资料实现方案直接调用系统 API,WallpaperManager 来实现 wallpaperManager.setResource系统源码分析系统app WallpaperPickerWallpaperPickerActivity ->…

在计算进程D状态持续时间及等IO的时间遇到的一处问题

一、背景 之前的博客 线程每次iodelay监控及D状态开始和结束监控并做堆栈记录-CSDN博客 里&#xff0c;我们讲到了通过内核模块抓取D状态的进程和等IO事件的方法&#xff0c;里面也用到了通过获取rq的symbol&#xff0c;再去获取rq里的rq_clock_task时间的方法&#xff08;内核…

Android11-12-13 替换系统默认壁纸

替换默认壁纸&#xff0c;是客需中再普通不过的需求&#xff0c;这里整理作为笔记记录 文章目录 需求场景 关联资料需求实现拓展总结 需求 客制化客户壁纸需求&#xff0c;替换客户定制的壁纸。 场景 手机-平板相关产品&#xff0c;各种广告机、工控、消费级产品&#xff0c…

Buffer overFolw---Kryo序列化出现缓冲区溢出的问题解决

问题&#xff1a; 由于我的数据量太大&#xff0c;我设置批次为10000万&#xff0c;50w数据大概有400M左右&#xff0c;然后进行spark数据处理时候报错为org.apache.spark.SparkException:Kryo serialization failed:Buffer overFolw.Available:0,rquired 58900977,To …

【Linux】线程基础

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.背景知识02.线程概念简单使用线程线程调度成本更低 01.背景知识 OS进行内存管理&#xff0c;不是以字节为单位的&#xff0c;而是以内存块为单位的&#xff0c;默认大小为4kb&…

「宇树科技」13家核心零部件供应商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;发布最新人形机器人研报&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形机器人100&#xff1a;全球人形机器人产业链梳理&#xff09;。 2025年2月20日&#xf…

Spring Boot 项目打包运行

打包成jar包&#xff0c;执行 java -jar 包名&#xff1b; 保证打出的jar包是独立可运行的包&#xff0c;需要xml中添加插件配置 <!-- SpringBoot应用打包插件--> <build><plugins><plugin><groupId>org.springframework.boot</groupId&…