数据结构 -- 图的存储

图的存储

邻接矩阵法

邻接矩阵存储不带权图

0 - 表示两个顶点不邻接

1 - 表示两个顶点邻接

在无向图中,每条边在矩阵中对应两个1

在有向图中,每条边在矩阵中对应一个1

//不带权图的邻接矩阵存储
#define MaxVertexNum 100		//顶点数目的最大值
typedef struct{char Vex[MaxVertexNum];int Edge[MaxVertexNum][MaxVertexNum];		//邻接矩阵,边表int vexnum,arcnum;			//图当前顶点数和边数/弧数
}MGraph;

因为矩阵中只需要存放0和1,所以也可以将Edge(二维数组)定义为bool类型或枚举类型,让矩阵变得更小,节省存储空间

求顶点的度、入度、出度

无向图:第i个顶点的度 = 第i行(或第i列)的非零元素个数 时间复杂度O(|V|)

有向图:第i个顶点的入度 = 第i行的非零元素个数 时间复杂度O(|V|)

​ 第i个顶点的出度 = 第i列的非零元素个数 时间复杂度O(|V|)

​ 第i个顶点的度 = 第i行和第i列的非零元素个数之和 时间复杂度O(|V|)

邻接矩阵存储带权图(网)
//邻接矩阵存储带权图(网)
#define MaxVertexNum 100		//顶点数目的最大值
#define INFINITY 最大的int//宏定义常量“无穷”		使用int的上限值表示“无穷”
typedef char VertexType;		//顶点的数据类型
typedef int EdgeType;			//带权图中边上权值的数据类型
typedef struct{VertexType Vex[MaxVertexNum];			//顶点EdgeType Edge[MaxVertexNum][MaxVertexNum];		//边的权int vexnum,arcnum;			//图的当前定点数和弧数
}

若两个顶点间没有边,则权值为无穷

也有一些教材将一个顶点与自身的权值记作0,所以在使用邻接矩阵表示带权图(网)时,如果两个点之间权值为0或∞,则代表这两个顶点间没有边

邻接矩阵法的性能分析

空间复杂度:O(|V|2) – 只和顶点数相关,和实际边数无关

当边数较少时,有大量的空间被浪费,所以邻接矩阵法适用于存储稠密图

无向图的邻接矩阵是对称矩阵,可以进行压缩存储(只存储上三角区/下三角区)

邻接矩阵的性质

设图G的邻接矩阵为A(矩阵元素为0/1),则An的元素An[i][j]等于由顶点i到顶点j的长度为n的路径的数目

邻接表法(顺序+链式存储)

//用邻接表存储的图
typedef struct{AdjList vertices;int vexnum,arcnum;
}ALGraph;
//顶点
typedef struct VNode{VertexType data;	//顶点信息ArcNode *first;		//第一条边/弧    
}VNode,AdjList[MaxVertexNum];
//“边/弧”
typedef struct ArcNode{int adjvex;		//边/弧指向哪个结点struct ArcNode *next;		//指向下一条弧的指针//InfoType info			//边权值
}ArcNode;//与树的孩子表示法相同

空间复杂度

无向图:边结点的数量为2|E|,整体的空间复杂度为O(|V|+2|E|)

有向图:边结点的数量为|E|,整体的空间复杂度为O(|V|+|E|)

求顶点的度、入度、出度

无向图:度 = 顶点指向的边链表中结点的数量

有向图:度 = 入度 + 出度

​ 出度 = 顶点指向的边链表中结点的数量

​ 入度 = 指向当前结点的弧的数量(需要遍历所有结点的边链表)

同一个图的邻接表表示方式不唯一(边链表各结点的顺序是任意的)

邻接表和邻接矩阵
邻接表邻接矩阵
空间复杂度无向图:O(|V|+2|E|);有向图:O(|V|+|E|)O(|V|2)
适用于存储稀疏图存储稠密图
表示方式不唯一唯一
计算度/入度/出度计算有向图的度和入度不方便,其余很方便必须遍历对应的行和列
找相邻的边找有向图的入边不方便,其余很方便必须遍历对应的行和列

十字链表法、邻接多重表

十字链表法(存储有向图)

【有向图存储】

邻接表:入度、入边寻找计算不方便

邻接矩阵:空间复杂度高

在这里插入图片描述
在这里插入图片描述

空间复杂度:O(|V|+|E|)

找出边:顺着绿色线路找

找入边:顺着橙色路线找

注意:十字链表法只能用于存储有向图

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

【存储无向图】

邻接表:每条边对应两份冗余信息,删除顶点、删除边时间复杂度高

邻接矩阵:空间复杂度高

在这里插入图片描述

空间复杂度:O(|V|+|E|)

删除边、删除节点等操作很方便

注意:邻接多重表只适用于存储无向图

小结
邻接表邻接矩阵十字链表法邻接多重表
空间复杂度无向图:O(|V|+2|E|);有向图:O(|V|+|E|)O(|V|2)O(|V|+|E|)O(|V|+|E|)
适用于存储稀疏图存储稠密图只能存有向图只能存无向图
表示方式不唯一唯一不唯一不唯一
删除边或顶点无向图中删除边或删除顶点都不方便删除边很方便,删除顶点需要大量移动数据很方便很方便
找相邻的边找有向图的入边必须遍历整个邻接表遍历对应行或列,时间复杂度O(|V|)很方便很方便

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

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

相关文章

25.4.4错题分析

计算机组成原理 总线特点 考察总线特点,串行总线,一次只传1bit,采用单条电缆,抗干扰能力强,传输距离较远,成本低,但传输速度慢,延迟较高,不适用大规模数据传输 并行总线…

规则引擎Drools

1.规则引擎概述 1.1 什么是规则引擎 规则引擎 全称为业务规则管理系统,英文名为BRMS,规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务规则,由用户或开发者在需要时进行配置和管理。 需…

框架PasteForm实际开发案例,换个口味显示数据,支持echarts,只需要标记几个特性即可在管理端显示(2)

PasteForm框架的主要思想就是对Dto进行标记特性,然后管理端的页面就会以不一样的UI呈现 使用PasteForm框架开发,让你免去开发管理端的烦恼,你只需要专注于业务端和用户端! 在管理端中,如果说表格是基本的显示方式,那么图表chart就是一个锦上添花的体现! 如果一个项目拥…

【工具】在 Visual Studio 中使用 Dotfuscator 对“C# 类库(DLL)或应用程序(EXE)”进行混淆

在 Visual Studio 中使用 Dotfuscator 进行混淆 Dotfuscator 是 Visual Studio 自带的混淆工具(Dotfuscator Community Edition,简称 CE)。它可以混淆 C# 类库(DLL)或应用程序(EXE)&#xff0c…

线程同步与互斥(上)

上一篇:线程概念与控制https://blog.csdn.net/Small_entreprene/article/details/146704881?sharetypeblogdetail&sharerId146704881&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我们学习了线程的控制及其相关概念之后&#…

[Linux系统编程]进程信号

进程信号 1. 信号入门1.1 信号基本概念1.2 技术应用角度的信号2. 信号的产生2.1 通过终端按键(如键盘)产生信号2.2 通过异常产生信号2.3 调用系统函数向进程发信号2.4 由软件条件产生信号2.5 总结3. 阻塞信号3.1 信号其他相关常见概念3.2 内核中的信号表示3.3 sigset_t3.3.1 …

要素的选择与转出

1.要素选择的三种方式 当要在已有的数据中选择部分要素时,ArcMap提供了三种方式:按属性选择、位置选择及按图形选择。 1)按属性选择 通过设置 SQL查询表达式,用来选择与选择条件匹配的要素。 (1)单击主菜单下【选择】【按属性选择】,打开【按…

Springboot + Vue + WebSocket + Notification实现消息推送功能

实现功能 基于Springboot与Vue架构,首先使用Websocket实现频道订阅,在实现点对点与群发功能后,在前端调用windows自带的消息通知,实现推送功能。 开发环境 Springboot 2.6.7vue 2.6.11socket-client 1.0.0 准备工作 在 Vue.js…

云手机如何防止设备指纹被篡改

云手机如何防止设备指纹被篡改 云手机作为虚拟化设备,其设备指纹的防篡改能力直接关系到账户安全、反欺诈和隐私保护。以下以亚矩阵云手机为例,讲解云手机防止设备指纹被篡改的核心技术及实现方式: 系统层加固:硬件级安全防护 1…

有人DTU使用MQTT协议控制Modbus协议的下位机-含数据库

本文为备忘录,不做太多解释。 DTU型号:G780 服务器:win2018 一。DTU设置 正确设置波特率,进入配置状态,获取当前参数,修改参数,设置并保存所有参数。 1.通道1设置 2.Modbus轮询设置 二&am…

湖北师范大学计信学院研究生课程《工程伦理》9.6章节练习

以下是图片中识别出的文字内容: 1【单选题】当工程师发现所在的企业或公司进行的工程活动会对环境、社会和公众的人身安全产生危害时,应该及时地给予反映或揭发。这属于工程师的( ) A、职业伦理责任 B、社会伦理责任 C、个人伦理责任 D、法律责任 2【单选题】下列哪个不属于工…

Axure RP 9 详细图文安装流程(附安装包)教程包含下载、安装、汉化、授权

文章目录 前言一、Axure RP 9介绍二、Axure RP 9 安装流程1. Axure RP 9 下载2. 启动安装程序3. 安装向导操作4.完成安装 三、Axure RP 9 汉化四、Axure RP 9授权 前言 本基础安装流程教程,将以清晰、详尽且易于遵循的步骤介绍Axure RP 9 详细图文安装流程&#xf…

SpringBoot全局exception处理最佳实践

目录 自定义异常类 抛出异常 全局异常处理器 自定义异常类 通常会继承 Exception 或其子类(如 RuntimeException)来定义业务异常类,用于封装业务相关的错误信息。一般选择继承 RuntimeException,因为它是一个非受检异常,在方法中抛出时不需要显式声明。 // 自定义业…

node ---- 解决错误【Error: error:0308010C:digital envelope routines::unsupported】

1. 报错 在 Node.js 18.18.0 的版本中,遇到以下错误: this[kHandle] new _Hash(algorithm, xofLen);^ Error: error:0308010C:digital envelope routines::unsupported这个错误通常发生在运行项目或构建时,尤其是在使用 Webpack、Vite 或其他…

浙江大学郑小林教授解读智能金融与AI的未来|附PPT下载方法

导 读INTRODUCTION 随着人工智能技术的飞速发展,智能金融已成为金融行业的重要变革力量。浙江大学人工智能研究所的郑小林教授在2025年3月24日的《智能金融:AI驱动的金融变革》讲座中,深入探讨了新一代人工智能在金融领域的应用及未来展望。 …

如何实现浏览器中的报表打印

在浏览器中实现打印一个报表,可以通过以下几种方法来完成。这里介绍一个基本的流程和相关代码示例: 1. 使用 JavaScript 的 window.print() 方法 这是最简单的方法,它会打开打印对话框,让用户选择打印选项。 示例代码&#xff1…

Linux系统调用编程

进程和线程 进程是操作系统资源分配的基本单位,拥有独立的地址空间、内存、文件描述符等资源,进程间相互隔离。每个进程由程序代码、数据段和进程控制块(PCB)组成,PCB记录了进程状态、资源分配等信息。 线程是…

【力扣hot100题】(054)全排列

挺经典的回溯题的。 class Solution { public:vector<vector<int>> result;void recursion(vector<int>& nums,vector<int>& now){if(nums.size()0){result.push_back(now);return ;}for(int i0;i<nums.size();i){now.push_back(nums[i]);…

【Ragflow】11. 文件解析流程分析/批量解析实现

概述 本文继续对ragflow文档解析部分进行分析&#xff0c;并通过脚本的方式实现对文件的批量上传解析。 文件解析流程 文件解析的请求处理流程大致如下&#xff1a; 1.前端上传文件&#xff0c;通过v1/document/run接口&#xff0c;发起文件解析请求 2.后端api\apps\docum…

2024年零知识证明(ZK)研究进展

Sumcheck 整个领域正在转向更多地依赖于 Sumcheck Protocol Sumcheck是用于验证多项式承诺的协议,常用于零知识证明(ZKP)中,尤其是在可验证计算和扩展性上。它的主要目的是通过对多项式进行分段检查,从而保证某个多项式在给定输入上的正确性,而不需要直接计算出整个多项…