当前位置: 首页 > news >正文

24考研数据结构-图的存储结构邻接矩阵

目录

  • 6.3 储存结构(邻接表表示法)
    • 1. 储存方式
    • 2. 结构
    • 3. 图的邻接表存储表示(算法)
    • 4. 结论
    • 5. 邻接矩阵和邻接表的对比
      • 邻接矩阵
        • 优点:
        • 缺点:
      • 邻接表
        • 优点:
        • 缺点:
      • 邻接矩阵与邻接表的关系
  • 6.4.拓展存储结构(十字链表,邻接多重表)很绕多理解
    • 1. 十字链表(存储有向图)
    • 2. 邻接多重表(存储无向图)
  • 6.5 四种存储结构的对比

6.3 储存结构(邻接表表示法)

1. 储存方式

在这里插入图片描述

2. 结构

【1】顶点的结点结构
———————
| data | firstarc |
———————

data数据域:储存顶点vi
firstarc链域:指向链表中第一个结点
【2】弧的结点结构
——————————
| adjvex | info | nextarc |
——————————

adjvex邻接点域:与顶点vi邻接的点在图中的位置
info数据域:储存和边相关的信息,如权值
nextarc链域:与顶点vi的点在图中的位置

3. 图的邻接表存储表示(算法)

#define MAX_VERTEXT_NUM 20
//建立边结点 
typedef struct ArcNode {int adjvex;                      // 该弧所指向的顶点的位置struct ArcNode *nextarc; // 指向下一条弧InfoType  *info;                // 该弧相关信息(可选)
}ArcNode; 
// 顶点结点
typedef struct VNode{VertexType data;              // 顶点信息ArcNode  *firstarc;          // 指向第一条依附该顶点的弧
}VNode,AdjList[MAX_VERTEXT_NUM];
//邻接表
typedef struct {Adjlist vertices;int vexnum,arcnum;int kind;
}ALGraph; 
//建立邻接表算法
//初始化一个结点总数为num的图,k为图的类型,num为结点总数
void InitG(ALGraph G,enum GraphKind k,int num)
{G.kind=k;G.vexnum=num;G.vertices=new VNode[vexnum];for(int i=0;i<G.vexnum;i++){G.vertices[i].Firstarc=NULL;cin>>G.vertics[i].data;}
}//有向图(网)增加弧的算法,将弧(from,to,weight)加入图
void InsertArc(ALGragh G,int from,int to,int weight)
{ArcNode *s=new ArcNode;s->weight=weight;s->adjvex=to;s->nextarc=G.vertices[from].firstarc;//插到链表vertices[from]的头G.vertices[from].firstarc=s;
}

4. 结论

(1)在邻接表中,同一条边对应两个结点。
(2)无向图中顶点v的度:等于v 对应的链表的长度;但是,在有向图中,要求顶点A的的入度,则需要遍历所有的顶点连接的链表,判断有几个存在顶点A;求出度,则是A顶点链表有几个点。
(3)判定两顶点v,w是否邻接:要看v对应的链表中有无对应的结点w(相反判断也行);
(4)对于一个图,给定的邻接表是并不唯一的(区分与邻接矩阵)
(5)增减边:要在两个单链表插入、删除结点;
(6)占用存储空间与顶点数、边数均有关;适用于边稀疏的图

注意,在有向图的邻接表中不易找到指向该顶点的弧。
邻接矩阵表示唯一,邻接表表示不唯一

5. 邻接矩阵和邻接表的对比

在这里插入图片描述


图是计算机科学中重要的数据结构之一,用于表示多对多的关系。在实际应用中,图可以用于表示网络拓扑、社交关系、路由算法等。对于图的存储结构,有两种常见的方式:邻接矩阵和邻接表。本文将介绍这两种存储结构的原理和特点,并对比它们之间的关系。

邻接矩阵

邻接矩阵是一种使用二维数组来表示图的存储结构。对于有n个节点的图,邻接矩阵是一个n*n的矩阵,其中的元素表示节点之间的关系。如果图中的节点i和节点j之间有边相连,则邻接矩阵中的第i行第j列的元素为1;否则,为0。

优点:

  • 查询快速:由于邻接矩阵是一个二维数组,可以通过下标直接访问节点之间的关系,查询操作的时间复杂度为O(1)。
  • 空间效率:在稠密图(边数接近节点数平方)中,邻接矩阵的存储效率较高。

缺点:

  • 空间复杂度高:对于稀疏图(边数远小于节点数平方),邻接矩阵会浪费大量空间来表示不存在的边。
class Graph {
private:int V; // 节点数int** adjMatrix; // 邻接矩阵public:Graph(int vertices) {V = vertices;adjMatrix = new int*[V];for (int i = 0; i < V; i++) {adjMatrix[i] = new int[V];for (int j = 0; j < V; j++) {adjMatrix[i][j] = 0;}}}void addEdge(int src, int dest) {adjMatrix[src][dest] = 1;adjMatrix[dest][src] = 1;}// 其他操作...
};

邻接表

邻接表是一种使用链表来表示图的存储结构。对于有n个节点的图,邻接表是一个包含n个链表的数组,每个链表存储与节点i相邻的节点。

优点:

  • 空间效率高:在稀疏图中,邻接表可以节省大量空间,只存储存在的边。
  • 插入和删除快速:在邻接表中插入或删除边相对较快。

缺点:

  • 查询效率低:在邻接表中查询节点i和节点j之间是否有边,需要遍历链表,平均时间复杂度为O(V)。
class Graph {
private:int V; // 节点数vector<list<int>> adjList; // 邻接表public:Graph(int vertices) {V = vertices;adjList.resize(V);}void addEdge(int src, int dest) {adjList[src].push_back(dest);adjList[dest].push_back(src);}// 其他操作...
};

邻接矩阵与邻接表的关系

邻接矩阵和邻接表是两种不同的图的存储结构,各自有着优缺点。对于边稠密的图,邻接矩阵可以提供较好的查询效率和空间效率;而对于边稀疏的图,邻接表则更加节省空间。

在实际应用中,我们需要根据具体的图的特点和操作需求来选择合适的存储结构。如果图是边稠密的,且需要频繁进行查询操作,邻接矩阵可能是一个不错的选择;如果图是边稀疏的,邻接表可以更好地节省空间。在有些情况下,我们也可以结合使用邻接矩阵和邻接表,充分发挥它们各自的优势,以满足实际需求。

综上所述,邻接矩阵和邻接表是图的两种常见存储结构,它们各自有着优缺点。在实际应用中,需要根据图的特点和操作需求进行选择,以达到最优的性能和空间效率。

6.4.拓展存储结构(十字链表,邻接多重表)很绕多理解

1. 十字链表(存储有向图)

  • 空间复杂度:O(|V|+|E|)
    在这里插入图片描述
  • 同层可找所有出边即出度(绿色)
  • 不同层相连的即所有入边(橙色)
  • 比邻接表空间复杂度的 v 2 v^2 v2更小
    在这里插入图片描述

2. 邻接多重表(存储无向图)

  • 解决无向图冗余信息的问题,空间大
  • 删除边,删除结点操作更简单(只要顺着指针找,就跟删除链表结点一样)
  • 空间复杂度:O(|V|+|E|),比邻接表的v+2e,因为不存储无关的结点
    在这里插入图片描述

6.5 四种存储结构的对比

在这里插入图片描述

相关文章:

24考研数据结构-图的存储结构邻接矩阵

目录 6.3 储存结构&#xff08;邻接表表示法&#xff09;1. 储存方式2. 结构3. 图的邻接表存储表示&#xff08;算法&#xff09;4. 结论5. 邻接矩阵和邻接表的对比邻接矩阵优点&#xff1a;缺点&#xff1a; 邻接表优点&#xff1a;缺点&#xff1a; 邻接矩阵与邻接表的关系 6…...

在线推算两个日期相差天数的计算器

具体请前往&#xff1a;在线推算两个日期相差天数的计算器...

Spring源码解析(七):bean后置处理器AutowiredAnnotationBeanPostProcessor

Spring源码系列文章 Spring源码解析(一)&#xff1a;环境搭建 Spring源码解析(二)&#xff1a;bean容器的创建、默认后置处理器、扫描包路径bean Spring源码解析(三)&#xff1a;bean容器的刷新 Spring源码解析(四)&#xff1a;单例bean的创建流程 Spring源码解析(五)&…...

【C#学习笔记】引用类型(1)

文章目录 引用类型class匿名类 记录引用相等和值相等record声明 接口delegate 委托合并委托/多路广播委托 引用类型 引用类型的变量存储对其数据&#xff08;对象&#xff09;的引用&#xff0c;而值类型的变量直接包含其数据。 对于引用类型&#xff0c;两种变量可引用同一对…...

STM32CubeMX+VSCODE+EIDE+RT-THREAD 工程创建

Eide环境搭建暂且不表&#xff0c;后续补充。主要记录下Vscode环境下 创建Rt-thread工程的过程。分别介绍STM32CubeMX添加rtt支持包的方式和手动添加rtt kernel方式。STM32CubeMX生成工程的时候有"坑"&#xff0c;防止下次忘记&#xff0c;方便渡一下有缘人&#xff…...

java中javamail发送带附件的邮件实现方法

java中javamail发送带附件的邮件实现方法 本文实例讲述了java中javamail发送带附件的邮件实现方法。分享给大家供大家参考。具体分析如下&#xff1a; JavaMail&#xff0c;顾名思义&#xff0c;提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它…...

Stable Diffusion高阶技能(2)-稳定扩散百态:解密AI绘画工具「SD WebUI」的提示词高级使用策略

简介 在我们的生活中,艺术元素可谓无处不在,而处于中心地位的绘画,无疑是携带着强烈的艺术魅力。现如今随着AI技术的日新月异,AI绘画对我们的生活世界的改造影响越来越深远。那么,如何让我们在AI绘画工具中更好的指导AI完成我们心中的作品呢? 这需要我们玩转这个工具的…...

【果树农药喷洒机器人】Part2:机器人变量喷药系统硬件选型

本专栏介绍:付费专栏,持续更新机器人实战项目,欢迎各位订阅关注。 关注我,带你了解更多关于机器人、嵌入式、人工智能等方面的优质文章! 文章目录 一、引言二、变量喷药系统总体要求2.1系统功能要求2.2系统技术要求三、机器人关键硬件选型3.1深度相机概述与选型3.2单片机选…...

解决vite+vue3项目npm装包失败

报错如下&#xff1a; Failed to remove some directories [ npm WARN cleanup [ npm WARN cleanup D:\\V3Work\\v3project\\node_modules\\vue, npm WARN cleanup [Error: EPERM: operation not permitted, rmdir D:\V3Work\v3project\node_modules\vue\reactivity\…...

Rust之错误处理

在Rust中&#xff0c;将错误分为两种&#xff0c;可恢复错误和不可恢复错误。所谓可恢复错误就是指类似于文件未找到这类错误&#xff0c;一般需要将它们报告给用户并再次尝试进行操作&#xff0c;而不可恢复错误往往就是Bug&#xff0c;需要停止程序的运行。 1、不可恢复错误…...

docker compose快速编排

Docker-compose概述 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容集群的快速编排 Docker-Compose将所管理的容器分为三层&#xff0c;分别是工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#xff09;以及容器&#x…...

java.io.File类的使用

文章目录 概述构造器常用方法1、获取文件和目录基本信息2、列出目录的下一级3.File类的重命名功能4、判断功能的方法5、创建、删除功能 练习 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#…...

TypeScript技能总结(三)

typescript是js的超集&#xff0c;目前很多前端框架都开始使用它来作为项目的维护管理的工具&#xff0c;还在不断地更新&#xff0c;添加新功能中&#xff0c;我们学习它&#xff0c;才能更好的在的项目中运用它&#xff0c;发挥它的最大功效 //泛型 > 参数和返回值类型相…...

python绿色版运行程序,python 绿色版免安装

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python绿色版运行程序&#xff0c;python 绿色版免安装&#xff0c;今天让我们一起来看看吧&#xff01; 软件简介 Python3.7.0 是一种被广大从业者广泛使用的通用型设计语言。该软件提供了丰富全面的模块&#xff0c;并…...

Python 向Excel写数据

1.项目终端导入 xlwt 库 pip install xlwt2.导入依赖包 import xlwt3.创建Excel表格类型文件 调用xlwt模块中的Workbook方法来创建一个excel表格类型文件&#xff0c;其中的第一个参数是设置数据的编码格式&#xff0c;这里是’utf-8’的形式&#xff0c;style_compression设…...

MySQL(1)

MySQL创建数据库和创建数据表 创建数据库 1. 连接 MySQL mysql -u root -p 2. 查看当前的数据库 show databases; 3. 创建数据库 create database 数据库名; 创建数据库 4. 创建数据库时设置字符编码 create database 数据库名 character set utf8; 5. 查看和显示…...

Android10 Recovery系列(二)增加OTG升级功能

一 、背景 起因是遇到了客户有这个需求,本着了解的原则,去看了一下之前Android版本的代码,想看看之前有没有现成的实现,移植过来。结果很不幸,没有找到。于是自己开始了功能实现的过程。下面分享一下该功能的实现 二 、准备工作 首先简单了解一下Recovery 模块的系统升…...

el-popover使用自定义图标

使用el-popover实现鼠标点击或浮动到自定义图标上弹出表格弹窗&#xff0c;官方文档上使用的是按钮el-button&#xff0c;如果想换成图标或其他的组件的话直接把el-button替换掉即可。注意替换之后的组件一定要加slot“reference”&#xff0c;不然组件是显示不出来的。 代码如…...

KCOM4串口转键鼠控制线测试说明

1.KOCM4介绍 KCOM4是一款最新开发的串口转键盘鼠标控制线&#xff0c;采用32位内核&#xff0c;最大60Mhz的工作频率&#xff0c;完美适用于游戏挂机等应用场景&#xff08;如果是用在工作电脑控制或展厅电脑控制推荐CH9329双头线&#xff09;。KCOM4支持普通键盘、相对鼠标、…...

2023华数杯数学建模C题完整5问代码思路分析

目前已经写出2023华数杯C题母亲身心健康对婴儿成长的影响全部5问的完整代码和42页论文&#xff08;正文30页&#xff0c;论文部分摘要如下&#xff1a; 本文共解决了五个问题&#xff0c;涉及婴儿行为特征、睡眠质量与母亲的身体指标和心理指标的关系&#xff0c;以及如何优化…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...