数据结构复习指导之图的存储及基本操作

文章目录

图的存储及基本操作

考纲内容

复习提示

1.邻接矩阵法

2.邻接表法

3.十字链表

4.邻接多重表

5.图的基本操作


图的存储及基本操作

图的存储必须要完整、准确地反映顶点集和边集的信息。根据不同图的结构和算法,采用不同的存储方式将对程序的效率产生相当大的影响,因此所选的存储结构应适合于待求解的问题。

考纲内容

(一)图的基本概念

(二)图的存储及基本操作
           邻接矩阵;邻接表;邻接多重表;十字链表
(三)图的遍历
           深度优先搜索;广度优先搜索
(四)图的基本应用
           最小(代价)生成树;最短路径;拓扑排序;关键路径

复习提示

图算法的难度较大,主要掌握深度优先搜索与广度优先搜索。掌握图的基本概念及基本性质、图的存储结构(邻接矩阵、邻接表、邻接多重表和十字链表)及特性、存储结构之间的转化、基于存储结构上的各种遍历操作和各种应用(拓扑排序、最小生成树、最短路径和关键路径)等。

图的相关算法较多,通常只需掌握其基本思想和实现步骤,而实现代码不是重点。

1.邻接矩阵法

所谓邻接矩阵存储,是指用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵

顶点数为n的图 G=(V,E)的邻接矩阵A是nxn的,将G的顶点编号为v_{1},v_{2},...,v_n,则

命题追踪——图的邻接矩阵存储及相互转换

对带权图而言,若顶点v_{i}v_{j}之间有边相连,则邻接矩阵中对应项存放着该边对应的权值,若顶点V_{i}V_{j}不相连,则通常用0或∞来代表这两个顶点之间不存在边:

有向图、无向图和网对应的邻接矩阵示例如图 6.5 所示。

命题追踪——(算法题)邻接矩阵的遍历及顶点的度的计算

图的邻接矩阵存储结构定义如下:

#define MaxVertexNum 100          //顶点数目的最大值
typedef char VertexType;          //顶点对应的数据类型
typedef int Edgerype;             //边对应的数据类型
typedef struct{VertexType vex[MaxVertexNum]; //顶点表EdgeType edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表int vexnum,arcnum;            //图的当前顶点数和边数
}MGraph;

注意

① 在简单应用中,可直接用二维数组作为图的邻接矩阵(顶点信息等均可省略)。
② 当邻接矩阵的元素仅表示相应边是否存在时,EdgeType 可用值为0和1的枚举类型。

③ 无向图的邻接矩阵是对称矩阵,对规模特大的邻接矩阵可采用压缩存储。

④ 邻接矩阵表示法的空间复杂度为 O(n²),其中n为图的顶点数|V|。

命题追踪——邻接矩阵的遍历的时间复杂度

图的邻接矩阵存储表示法具有以下特点:

① 无向图的邻接矩阵一定是一个对称矩阵(并且唯一)。因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素。

命题追踪——基于邻接矩阵的顶点的度的计算

② 对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是顶点i的度 TD(v_{i})

③ 对于有向图,邻接矩阵的第i行非零元素(或非∞元素)的个数正好是顶点i的出度OD(v_{i});

第i列非零元素(或非∞元素)的个数正好是顶点i的入度ID(v_{i})

④ 用邻接矩阵存储图,很容易确定图中任意两个顶点之间是否有边相连。但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很

大。

⑤ 稠密图(即边数较多的图)适合采用邻接矩阵的存储表示。

命题追踪——计算A²并说明A^{n}[i][j]的含义

⑥ 设图 G 的邻接矩阵为 A,A^{n}的元素 A^{n}[i][j]等于由顶点i到顶点j的长度为 n的路径的数目。该结论了解即可,证明方法可参考离散数学教材。

2.邻接表法

当一个图为稀疏图时,使用邻接矩阵法显然会浪费大量的存储空间,而图的邻接表法结合了顺序存储和链式存储方法,大大减少了这种不必要的浪费。

所谓邻接表,是指对图 G中的每个顶点v_{i}建立一个单链表,第i个单链表中的结点表示依附于顶点v_{i}的边(对于有向图则是以顶点v_{i}为尾的弧),这个单链表就称为顶点v_{i}边表(对于有向图则称为出边表)。

边表的头指针和顶点的数据信息采用顺序存储,称为顶点表,所以在邻接表中存在两种结点:顶点表结点和边表结点,如图6.6所示。

顶点表结点由两个域组成:顶点域(data)存储顶点v_{i}的相关信息,边表头指针域(firstarc)指向第一条边的边表结点。

边表结点至少由两个域组成:邻接点域(adjvex)存储与头结点顶点v_{i}邻接的顶点编号,指针域(nextarc)指向下一条边的边表结点。

命题追踪——图的邻接表存储的应用

无向图和有向图的邻接表的实例分别如图6.7和图6.8所示,

图的邻接表存储结构定义如下:

#define MaxVertexNum 100       //图中顶点数目的最大值
typedef struct ArcNode(        //边表结点int adjvex;                //该弧所指向的顶点的位置struct ArcNode *nextarc;   //指向下一条弧的指针//InfoType info;           //网的边权值
}ArcNode;
typedef struct VNode{          //顶点表结点VertexType data;           //顶点信息ArcNode *firstarc;         //指向第一条依附该顶点的弧的指针
}VNode,AdjList[MaxVertexNum】;
typedef struct{AdjList vertices;          //邻接表int vexnumarcnum;          //图的顶点数和弧数
}ALGraph;                      //ALGraph是以邻接表存储的图类型

图的邻接表存储方法具有以下特点:

① 若 G为无向图,则所需的存储空间为 O(|V|+2|E|);若 G为有向图,则所需的存储空间为O(|V|+|E|)。

前者的倍数2是因为在无向图中,每条边在邻接表中出现了两次。

命题追踪——邻接矩阵法和邻接表法的适用性差异

② 对于稀疏图(即边数较少的图),采用邻接表表示将极大地节省存储空间。

③ 在邻接表中,给定一个顶点,能很容易地找出它的所有邻边,因为只需要读取它的邻接表。

在邻接矩阵中,相同的操作则需要扫描一行,花费的时间为 O(n)。

但是,若要确定给定的两个顶点间是否存在边,则在邻接矩阵中可以立刻查到,而在邻接表中则需要在相应结点对应的边表中查找另一结点,效率较低。

④ 在无向图的邻接表中,求某个顶点的度只需计算其邻接表中的边表结点个数。

在有向图的邻接表中,求某个顶点的出度只需计算其邻接表中的边表结点个数;

但求某个顶点x的入度则需遍历全部的邻接表,统计邻接点(adjvex)域为x的边表结点个数。

⑤ 图的邻接表表示并不唯一,因为在每个顶点对应的边表中,各边结点的链接次序可以是任意的,它取决于建立邻接表的算法及边的输入次序。

3.十字链表

十字链表是有向图的一种链式存储结构。在十字链表中,有向图的每条弧用一个结点(弧结点)来表示,每个顶点也用一个结点(顶点结点)来表示。

两种结点的结构如下所示。

弧结点中有5个域:

  • tailvex和 headvex 两个域分别指示弧尾弧头这两个顶点的编号;
  • 头链域 hlink 指向弧头相同的下一个弧结点;
  • 尾链域 tlink 指向弧尾相同的下一个弧结点;
  • info 域存放该弧的相关信息。

这样,弧头相同的弧在同一个链表上,弧尾相同的弧也在同一个链表上。

顶点结点中有3 个域:

  • data 域存放该顶点的数据信息,如顶点名称;
  • firstin 域指向以该顶点为弧头的第一个弧结点;
  • firstout 域指向以该顶点为弧尾的第一个弧结点。

图 6.9为有向图的十字链表表示法。

注意,顶点结点之间是顺序存储的,弧结点省略了 info 域。

在十字链表中,既容易找到Vi 为尾的弧,也容易找到Vi为头的弧,因而容易求得顶点的出度和入度。

图的十字链表表示是不唯一的,但一个十字链表表示唯一确定一个图

4.邻接多重表

邻接多重表是无向图的一种链式存储结构。在邻接表中,容易求得顶点和边的各种信息,但在邻接表中求两个顶点之间是否存在边而对边执行删除等操作时,需要分别在两个顶点的边表中遍历,效率较低。

与十字链表类似,在邻接多重表中,每条边用一个结点表示,其结构如下所示。

其中,ivex 和 jvex 这两个域指示该边依附的两个顶点的编号;

ilink 域指向下一条依附于顶点 ivex 的边;

jlink 域指向下一条依附于顶点 jvex 的边,info 域存放该边的相关信息。

每个顶点也用一个结点表示,它由如下所示的两个域组成。

其中,data 域存放该顶点的相关信息,firstedge 域指向第一条依附于该顶点的边。

在邻接多重表中,所有依附于同一顶点的边串联在同一链表中,因为每条边依附于两个顶点,所以每个边结点同时链接在两个链表中。

对无向图而言,其邻接多重表和邻接表的差别仅在于,同一条边在邻接表中用两个结点表示,而在邻接多重表中只有一个结点

图 6.10为无向图的邻接多重表表示法。邻接多重表的各种基本操作的实现和邻接表类似。

图的四种存储方式的总结如表 所示。

邻接矩阵邻接表十字链表邻接多重表
空间复杂度O(|V|²)

无向图:O(|V|+2|E|)

有向图:O(|V|+|E|)

O(|V|+|E|)O(|V|+|E|)
找相邻边遍历对应行或列的时间复杂度为O(|V|)找有向图的入度必须遍历整个邻接表很方便很方便
删除边或顶点删除边很方便,删除顶点需要大量移动数据无向图中删除边或顶点都不方便很方便很方便
适用于稠密图稀疏图和其他只能存有向图只能存无向图
表示方法唯一不唯一不唯一不唯一

5.图的基本操作

图的基本操作是独立于图的存储结构的。而对于不同的存储方式,操作算法的具体实现会有着不同的性能。

在设计具体算法的实现时,应考虑采用何种存储方式的算法效率会更高。

图的基本操作主要包括(仅抽象地考虑,所以忽略各变量的类型):

  • Adjacent(G,x,y):判断图 G 是否存在边<x,y>或(x,y)。
  • Neighbors(G,x):列出图G中与结点x邻接的边。
  • InsertVertex(G,x):在图G中插入顶点x。
  • DeleteVertex(G,x):从图G中删除顶点x。
  • AddEdge(G,x,y):若无向边(x,y)或有向边<x,y>不存在,则向图G中添加该边。
  • RemoveEdge(G,x,y):若无向边(x,y)或有向边<x,y>存在,则从图G中删除该边
  • FirstNeighbor(G,x):求图G中顶点 x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回 -1。
  • NextNeighbor(G,x,y):假设图G 中顶点y是顶点x的一个邻接点,返回除y外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1。
  • Get_edge_value(G,x,y):获取图 G 中边(x,y)或<x,y>对应的权值。
  • Set_edge_value(G,x,y,v):设置图G 中边(x,y)或<x,y>对应的权值为 v。

此外,还有图的遍历算法:按照某种方式访问图中的每个顶点且仅访问一次。

图的遍历算法包括深度优先遍历广度优先遍历,具体见下一节的内容。

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

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

相关文章

Axure “情形”的使用

这篇笔记的主要内容是如果在Axure中使用“情形”&#xff0c;对应在我们的研发中就是“判断条件”的使用 Axure情形的使用Axure添加caseAxure的if &#xff0c;sele if 条件判断 条件判断不管是在研发代码中还是实际生活中&#xff0c;无处不在&#xff0c;只是表现形式不同罢…

GeoServer /geoserver/wms RCE漏洞复现(CVE-2022-24816)

0x01 产品简介 GeoServer是一款开源的地理数据服务器软件,主要用于发布、共享和处理各种地理空间数据。它支持众多的地图和空间数据标准,能够使各种设备通过网络来浏览和使用这些地理信息数据。 0x02 漏洞概述 GeoServer /geoserver/wms 接口处存在远程代码执行漏洞,未经…

网络故障快速定位的秘诀 - 基于 AnaTraf 全流量回溯分析

网络故障是每个 IT 从业者都深有体会的头疼问题。当网络出现异常时,如何快速定位故障原因,恢复网络正常运行,是考验运维能力的关键所在。借助 AnaTraf 网络流量分析仪的全流量回溯分析功能,您可以轻松应对各种复杂的网络问题,实现快速故障定位。 1. 网络故障分析的痛点 网络故…

Redission分布式锁 - 抢课系统

使用Redission分布式锁与Kafka消息队列&#xff0c;实现学生抢课系统&#xff08;高并发秒杀场景&#xff09;。 目录 一、思路1.为频繁访问的信息设置缓存&#xff08;1&#xff09;登陆&#xff08;2&#xff09;课程任务信息&#xff08;3&#xff09;用户抢课记录 2.消息队…

【Kubenetes】微服务治理:服务网格Istio安装搭建体验

文章目录 ServiceMesh介绍Istio解决方案安装Istio第一步 下载istio第二步 安装istio环境第三部 安装istio应用第四部 暴露到外部流量然后再下一步 把dashboard弄好 ServiceMesh介绍 扯淡环节 什么是服务网格?–服务间通信&#xff0c;可扩展性和灵活性服务网格的工作原理 --…

【js刷题:数据结构链表之设计链表】

设计链表 一、题目二、题解 一、题目 二、题解 // 定义节点类&#xff0c;每个节点都有一个值和一个指向下一个节点的引用 class LinkNode{constructor(val,next){ // 构造函数&#xff0c;接收节点值和下一个节点的引用this.valval // 节点的值this.nextnext // 指…

接口文档编写注意事项

接口文档编写注意事项 字段方面 ①不需要的字段、逻辑中固定值的字段&#xff08;可写死的字段&#xff09;不提供 ②逻辑上可以合并的字段合并 例如&#xff1a;当一个互斥条件下&#xff0c;分别返回了两个字段&#xff0c;这个时候就可以在这个基础上将两个字段合并成一个…

Linux连接文件那点事

什么是连接文件 将一个文件和另一个文件建立联系&#xff0c;分为硬链接和软连接&#xff08;符号连接&#xff09;。 硬链接 Linux中&#xff0c;所有的文件都有一个inode&#xff0c;这个东西就是文件的ID号&#xff0c;硬链接的方式就是通过这个inode来产生新的文件名来建…

Stable Diffusion入门使用技巧及个人试用实例分享--生成稳定人物及姿势篇

上节我们主要讲解了SD提示词的实践篇及ControlNet常用模型篇&#xff0c;本节主要想给大家分享一下如何在不自己单独训练lora的情况下尽量稳定的控制生成的人物的脸及姿势。欢迎阅读。 一、如何稳定生成相同的人物&#xff08;脸部&#xff09; 1、瞎编名字法&#xff1a; d…

ICode国际青少年编程竞赛- Python-6级训练场-多重递归

ICode国际青少年编程竞赛- Python-6级训练场-多重递归 1、 def move(a, b):if a > 12:returnDev.step(a)Dev.turnRight()if b < 4:move(a, b1)else:move(a2, 1) move(2, 1)2、 def move(a, b):if a < 2:returnif b 1: Spaceship.step(2)Dev.step(a)Dev.turnRight()De…

智能AI数字人直播带货软件系统,支持所有平台直播可带货,引流私域,同城团购 带源代码包

系统概述 智能AI数字人直播带货软件系统是一款基于人工智能技术的创新产品&#xff0c;该系统集成了深度学习、自然语言处理、图像识别等多项前沿技术&#xff0c;能够模拟真实主播的行为和表情&#xff0c;实现高度智能化的直播带货体验。该系统支持所有主流直播平台&#xf…

IDEA的妙用

IDEA 安装破解 复制JetbrainsIdesCrack-4.2.jar到安装目录下 修改安装目录下的bin目录的idea64.exe.vmoptions&#xff1a; 最后一行添加&#xff1a;-javaagent:E:\develop\JetBrains\IntelliJ IDEA 2018.3.5\bin\JetbrainsIdesCrack-4.2.jar(注意&#xff1a;使用自己的路…

Vue.js 详细介绍

文章目录 一、Vue.js 简介1.1 什么是 Vue.js&#xff1f;1.2 Vue.js 的特点 二、快速上手 Vue.js2.1 安装 Vue.js使用 CDN使用 npm 或 yarn 2.2 创建一个 Vue 实例2.3 Vue.js 项目结构 三、Vue.js 核心概念3.1 数据绑定3.2 指令&#xff08;Directives&#xff09;3.3 组件&…

MATLAB车辆动力学建模 ——《控制系统现代开发技术》

引言 在上这门课之前&#xff0c;我已经用过CasADi 去做过最优化的相关实践&#xff0c;其中每一步迭代主要就是由&#xff1a;对象系统优化求解两部分组成的。这里我们重点介绍 “对象系统”如何去描述 &#xff0c;因为它是每一步迭代中重要的一环——“优化求解”会获得控制…

Linux系统中pts和tty会话删除

一、背景 一台CentOS6.7主机存在iscsi盘&#xff0c;为了正常卸载此iscsi盘&#xff0c;需要先将所有相关会话退出使用该iscsi盘。 检查发现存在多个系统用户登录的情况。 二、问题 无法使用kill -9删除linux会话&#xff0c;提示信息为“-bash: kill: (16680) - Operation not…

java项目之企业资产管理系统(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的企业资产管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员功能有个人中心&…

【全开源】JAVA红娘婚恋相亲交友系统源码支持微信小程序+微信公众号+H5+APP

红娘婚恋相亲交友系统&#xff1a;遇见你的命中注定 在快节奏的现代生活中&#xff0c;许多单身男女都在寻找一个平台&#xff0c;希望能遇见那个能与自己携手共度一生的伴侣。红娘婚恋相亲交友系统正是为了满足这一需求而诞生的&#xff0c;它旨在为广大单身男女提供一个安全…

咒语和药水的成功对数

题目链接 咒语和药水的成功对数 题目描述 注意点 一个咒语和药水的能量强度相乘如果大于等于 success &#xff0c;那么它们视为一对成功的组合 解答思路 先将药水进行排序&#xff0c;然后二分查找找到某个咒语i和药水的能量强度相乘大于等于success的左边界left&#xf…

A股股息率最高的十个行业,哪些高股息可持续?

2023年以来&#xff0c;银行不断调低存款利率。目前&#xff0c;六大行5年定期存款&#xff08;整存整取&#xff09;挂牌利率约为2%。随着存款收益下降&#xff0c;那些股息率较高的上市公司和行业受到了关注。 数据分析显示&#xff0c;一部分行业的高股息可以持续&#xff…

JAVA云HIS医院管理系统源码 云HIS系统源码 SaaS模式 采用Java+Spring,SpringBoot开发的云HIS医院管理系统

云HIS采用JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&#xff0c;MyBatisPlus技术开发。可满足诊所业务中预约、看诊、收费、发药、药库管理、经营分析等多环节的工作需要。和传统医院系统相比&#xff0c;云HIS的操作简单&#xff0c;…