26考研——图_图的存储(6)
408答疑
文章目录
- 二、图的存储
- 图的存储相关概念
- 邻接矩阵存储方式
- 邻接矩阵的定义
- 顶点的度计算
- 邻接矩阵的特点
- 邻接矩阵的局限性
- 应用场景
- 邻接矩阵的幂次意义(了解即可)
- 邻接表存储方式
- 邻接表定义
- 邻接表结构
- 邻接表的特点
- 邻接矩阵和邻接表的适用性差异
- 十字链表
- 十字链表定义
- 十字链表结构
- 十字链表的特点
- 十字链表的适用性
- 邻接多重表
- 邻接多重表定义
- 邻接多重表结构
- 邻接多重表的特点
- 邻接多重表的适用性
- 总结对比
- 六、参考资料
- 鲍鱼科技课件
- 26王道考研书
二、图的存储
图的存储相关概念
- 图的存储必须要完整、准确地反映顶点集和边集的信息。
- 根据不同图的结构和算法,采用不同的存储方式将对程序的效率产生相当大的影响,因此所选的存储结构应适合于待求解的问题。
邻接矩阵存储方式
邻接矩阵的定义
对于顶点数为 n n n 的图 G = ( V , E ) G=(V, E) G=(V,E),其邻接矩阵 A A A 是 n × n n \times n n×n 的二维数组。邻接矩阵存储方式通过二维数组表示图的结构:
- 顶点信息:使用一维数组存储图中所有顶点的信息。
- 边信息:使用二维数组(邻接矩阵)存储顶点之间的邻接关系。
若顶点编号为 v 1 , v 2 , ⋯ , v n v_1, v_2, \cdots, v_n v1,v2,⋯,vn,则矩阵元素定义为:
- 普通图(无权重):
A [ i ] [ j ] = { 1 , 若存在边 ( v i , v j ) 或 < v i , v j > 0 , 否则 A[i][j] = \begin{cases} 1, & \text{若存在边 $(v_i, v_j)$ 或 $<v_i, v_j>$} \\ 0, & \text{否则} \end{cases} A[i][j]={1,0,若存在边 (vi,vj) 或 <vi,vj>否则 - 有向图的邻接矩阵中,非对称元素表示单向边。
- 无向图的邻接矩阵为对称矩阵。

- 带权图(网):
A [ i ] [ j ] = { w i j , 若存在边 ( v i , v j ) 或 < v i , v j > 0 或 ∞ , 否则(通常对角线元素用 0 表示) A[i][j] = \begin{cases} w_{ij}, & \text{若存在边 $(v_i, v_j)$ 或 $<v_i, v_j>$} \\ 0 \text{ 或 } \infty, & \text{否则(通常对角线元素用 $0$ 表示)} \end{cases} A[i][j]={wij,0 或 ∞,若存在边 (vi,vj) 或 <vi,vj>否则(通常对角线元素用 0 表示) - 网的邻接矩阵中,非零元素表示边的权值, 0 0 0 或 ∞ \infty ∞ 表示无边。

顶点的度计算
- 无向图:顶点 v i v_i vi 的度 TD ( v i ) \text{TD}(v_i) TD(vi) 等于邻接矩阵第 i i i 行(或第 i i i 列)非零元素个数。
- 有向图:
- 出度 OD ( v i ) \text{OD}(v_i) OD(vi):第 i i i 行非零元素个数。
- 入度 ID ( v i ) \text{ID}(v_i) ID(vi):第 i i i 列非零元素个数。
邻接矩阵的特点
- 有向图与无向图的区别:
- 有向图的邻接矩阵可能不对称。
- 无向图的邻接矩阵是对称矩阵。
- 空间复杂度:顶点数为 n n n 时,邻接矩阵的空间复杂度为 O ( n 2 ) O(n^2) O(n2),适合稠密图。
- 二维数组的行和列对应顶点的编号,矩阵元素表示顶点间的连接关系。
- 例如,矩阵中第 i i i 行第 j j j 列的值表示顶点 v i v_i vi 到 v j v_j vj 是否存在边或边的权重。
- 邻接矩阵的遍历时间复杂度:基于邻接矩阵的遍历(如DFS、BFS)时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
邻接矩阵的局限性
- 边数统计:需遍历整个矩阵,时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
- 稀疏图效率低:存储大量 0 0 0 或 ∞ \infty ∞ 元素浪费空间。
应用场景
- 邻接矩阵便于快速判断顶点间的邻接关系(时间复杂度 O ( 1 ) O(1) O(1))。
- 适合需要频繁查询边存在的场景,但对稀疏图存储效率较低。
邻接矩阵的幂次意义(了解即可)
- 设邻接矩阵为 A A A,则 A n [ i ] [ j ] A^n[i][j] An[i][j] 表示顶点 i i i 到 j j j 的长度为 n n n 的路径数目。
邻接表存储方式
邻接表定义
- 邻接表是数组和链表的结合存储操作。
- 数组存放的是顶点,链表的结点表示边。
邻接表结构
-
顶点表结点由两个域组成:
- 顶点域(data):存储顶点 v i v_i vi 的相关信息。
- 边表头指针域(firstarc):指向第一条边的边表结点。

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

-
无向图和有向图的邻接表的实例


邻接表的特点
- 存储空间:
- 若 G G G 为无向图,则所需的存储空间为 O ( ∣ V ∣ + 2 ∣ E ∣ ) O(|V| + 2|E|) O(∣V∣+2∣E∣);
- 若 G G G 为有向图,则所需的存储空间为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(∣V∣+∣E∣)。
- 稀疏图的存储:
- 对于稀疏图(即边数较少的图),采用邻接表表示将极大地节省存储空间。
- 操作效率:
- 在邻接表中,给定一个顶点,能很容易地找出它的所有邻边,因为只需要读取它的邻接表。
- 在邻接矩阵中,相同的操作则需要扫描一行,花费的时间为 O ( n ) O(n) O(n)。但是,若要确定给定的两个顶点间是否存在边,则在邻接矩阵中可以立刻查到,而在邻接表中则需要在相应结点对应的边表中查找另一结点,效率较低。
- 顶点的度:
- 在无向图的邻接表中,求某个顶点的度只需计算其邻接表中的边表结点个数。
- 在有向图的邻接表中,求某个顶点的出度只需计算其邻接表中的边表结点个数;但求某个顶点 x x x 的入度则需遍历全部的邻接表,统计邻接点(adjvex)域为 x x x 的边表结点个数。
- 邻接表的唯一性:
- 图的邻接表表示并不唯一,因为在每个顶点对应的边表中,各边结点的链接次序可以是任意的,它取决于建立邻接表的算法及边的输入次序。
邻接矩阵和邻接表的适用性差异
- 对于稀疏图,邻接表法比邻接矩阵法更节省存储空间。
- 在邻接表中,给定顶点查找其所有邻边的效率较高,但在邻接矩阵中,确定两个顶点间是否存在边的效率更高。
十字链表
十字链表定义
- 十字链表是针对有向图的一种链式存储结构。
- 在十字链表中,有向图的每条弧用一个结点(弧结点)来表示,每个顶点也用一个结点(顶点结点)来表示。
十字链表结构
-
弧结点:
- 有 5 个域:
tailvex、headvex、hlink、tlink、info。tailvex和headvex两个域分别指示弧尾和弧头这两个顶点的编号。hlink指向弧头相同的下一个弧结点。tlink指向弧尾相同的下一个弧结点。info存放该弧的相关信息。
- 弧头相同的弧在同一个链表上,弧尾相同的弧也在同一个链表上。

- 有 5 个域:
-
顶点结点:
- 有 3 个域:
data、firstin、firstout。data域存放该顶点的数据信息,如顶点名称。firstin域指向以该顶点为弧头的第一个弧结点。firstout域指向以该顶点为弧尾的第一个弧结点。
- 有 3 个域:

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

十字链表的特点
- 在十字链表中,既容易找到 V i V_i Vi 为尾的弧,也容易找到 V i V_i Vi 为头的弧,因而容易求得顶点的出度和入度。
- 图的十字链表表示不是唯一的,但一个十字链表表示唯一确定一个图。
十字链表的适用性
- 十字链表适合用于有向图的存储,能够有效地表示和操作有向图的边和顶点。
邻接多重表
邻接多重表定义
- 邻接多重表是无向图的一种链式存储结构。
- 在邻接表中,容易求得顶点和边的各种信息,但在邻接表中求两个顶点之间是否存在边而对边执行删除等操作时,需要分别在两个顶点的边表中遍历,效率较低。
邻接多重表结构
- 每条边用一个结点表示,其结构如下所示:
ivex和jvex这两个域指示该边依附的两个顶点的编号;ilink域指向下一条依附于顶点ivex的边;jlink域指向下一条依附于顶点jvex的边;info域存放该边的相关信息。

- 每个顶点也用一个结点表示,它由两个域组成:
data域存放该顶点的相关信息;firstedge域指向第一条依附于该顶点的边。

- 邻接多重表的各种基本操作的实现和邻接表类似。

邻接多重表的特点
- 在邻接多重表中,所有依附于同一顶点的边串联在同一个链表中,因为每条边依附于两个顶点,所以每个边结点同时链接在两个链表中。
- 对无向图而言,其邻接多重表和邻接表的差别仅在于,同一条边在邻接表中用两个结点表示,而在邻接多重表中只有一个结点。
邻接多重表的适用性
- 邻接多重表适合用于无向图的存储,能够有效地表示和操作无向图的边和顶点。
- 邻接多重表的各种基本操作的实现和邻接表类似。
总结对比
| 存储方式 | 邻接矩阵 | 邻接表 | 十字链表 | 邻接多重表 |
|---|---|---|---|---|
| 空间复杂度 | O ( O( O(| V V V| 2 ) ^2) 2) | 无向图: O ( O( O(| V V V|+2| E E E| ) ) ) 有向图: O ( O( O(| V V V|+| E E E| ) ) ) | O ( O( O(| V V V|+| E E E| ) ) ) | O ( O( O(| V V V|+| E E E| ) ) ) |
| 找相邻边 | 遍历对应行或列的时间复杂度为 O ( O( O(| V V V| 2 ) ^2) 2) | 找有向图的入度必须遍历整个邻接表 | 很方便 | 很方便 |
| 删除边或顶点 | 删除边很方便,删除顶点需要大量移动数据 | 无向图中删除边或顶点都不方便 | 很方便 | 很方便 |
| 适用于 | 稠密图 | 稀疏图和其他 | 只能存有向图 | 只能存无向图 |
| 表示方式 | 唯一 | 不唯一 | 不唯一 | 不唯一 |
六、参考资料
鲍鱼科技课件
b站免费王道课后题讲解: link

网课全程班: link

26王道考研书
相关文章:
26考研——图_图的存储(6)
408答疑 文章目录 二、图的存储图的存储相关概念邻接矩阵存储方式邻接矩阵的定义顶点的度计算邻接矩阵的特点邻接矩阵的局限性 应用场景邻接矩阵的幂次意义(了解即可) 邻接表存储方式邻接表定义邻接表结构邻接表的特点 邻接矩阵和邻接表的适用性差异十字…...
Spark读取文件系统的数据(sbt打包测试)-入门级别Demo
学习目标 通过本关卡练习,您将学到: 如何使用Spark访问本地文件和HDFS文件Spark应用程序的编写、编译和运行方法 相关知识 操作系统:Ubuntu 16.04; Spark版本:2.4.0; Hadoop版本:3.1.3。 编…...
5.1 位运算专题:LeetCode 面试题 01.01. 判定字符是否唯一
1. 题目链接 LeetCode 面试题 01.01. 判定字符是否唯一 2. 题目描述 实现一个算法,确定一个字符串的所有字符是否全部唯一(即没有重复字符)。要求如下: 不使用额外的数据结构(如哈希表)字符串仅包含小写…...
datawhale组队学习--大语言模型—task4:Transformer架构及详细配置
第五章 模型架构 在前述章节中已经对预训练数据的准备流程(第 4 章)进行了介绍。本章主 要讨论大语言模型的模型架构选择,主要围绕 Transformer 模型(第 5.1 节)、详细 配置(第 5.2 节)、主流架…...
Python虚拟环境:从入门到实战指南
目录 一、为什么需要Python虚拟环境? 二、如何创建Python虚拟环境? 1. 使用venv(Python 3.3内置) 2. 使用virtualenv(第三方工具) 3. 使用conda(适合数据科学项目) 三、虚拟环…...
如何提升 Java 开发能力?
如何提升 Java 开发能力? 要系统提升 Java 开发能力,需从 基础巩固、技术拓展、实战经验、持续学习 四个维度入手。以下是详细的进阶路径和具体建议: 一、夯实 Java 核心基础 深入理解语言特性 必学内容: JVM 原理:…...
《TCP/IP网络编程》学习笔记 | Chapter 21:异步通知 I/O 模型
《TCP/IP网络编程》学习笔记 | Chapter 21:异步通知 I/O 模型 《TCP/IP网络编程》学习笔记 | Chapter 21:异步通知 I/O 模型同步与异步同步异步对比同步 I/O 的缺点异步 I/O 的优点 理解异步通知 I/O 模型实现异步通知 I/O 模型WSAEventSelect 函数和通知…...
Qt6相对Qt5的主要提升(AI总结)
我: Qt 6 相对于5 有哪些新功能? Qt 6 相对于 Qt 5 有诸多新功能和改进,以下是主要的新增特性: 1. 架构和核心库的重构 模块化设计:Qt 6 采用了更加灵活的模块化设计,开发者可以按需引入必要的功能模块&a…...
消息队列ActiveMQ、RabbitMQ、RocketMQ、Kafka对比分析和选型
ActiveMQ、RabbitMQ、RocketMQ、Kafka对比分析和选型 四大消息队列详细对比 1. ActiveMQ 核心特性: 基于JMS规范,支持多种协议(AMQP、STOPP、MQTT等)。提供主从架构(Master-Slave)和共享存储集群。支持持…...
2025:sql注入详细介绍
先说一个阿里云学生无门槛免费领一年2核4g服务器的方法: 阿里云服务器学生无门槛免费领一年2核4g_阿里云学生认证免费服务器-CSDN博客 SQL注入(SQL Injection)是一种常见的网络安全漏洞,攻击者通过在应用程序的输入参数中注入恶意…...
MyBatis操作数据库进阶——动态SQL
动态 SQL 是根据程序运行时的条件灵活生成不同 SQL 语句的技术。它的核心目的是在不修改代码 的前提下,通过条件判断、循环等逻辑,动态拼接 SQL 片段,解决传统 SQL 语句死板、难以应对复杂业务场景的问题。 一、<if> 标签 先来观…...
使用LLama-Factory的简易教程(Llama3微调案例+详细步骤)
引言:一套快速实现 Llama3 中文微调的教程 主要参考:胖虎遛二狗的 B 站教学视频《【大模型微调】使用Llama Factory实现中文llama3微调》 ✅ 笔者简介:Wang Linyong,西工大,2023级,计算机技术 研究方向&am…...
LabVIEW发电平台数据采集系统
本文详细介绍了基于LabVIEW的摇臂式波浪发电平台数据采集系统的设计与实现。通过整合LabVIEW软件与多种传感器技术,本系统能够有效提升数据采集的准确性和效率,为波浪能的利用和发电设备的优化提供科学依据。 项目背景 随着全球能源需求增长和环境保…...
气象可视化卫星云图的方式:方法与架构详解
气象卫星云图是气象预报和气候研究的重要数据来源。通过可视化技术,我们可以将卫星云图数据转化为直观的图像或动画,帮助用户更好地理解气象变化。本文将详细介绍卫星云图可视化的方法、架构和代码实现。 一、卫星云图可视化方法 1. 数据获取与预处理 卫星云图数据通常来源…...
abaqus 二次开发 No module named ‘abaqusConstants
在 Python 中遇到 “No module named ‘abaqusConstants’” 错误通常意味着 Python 无法找到名为 abaqusConstants 的模块。这可能是由以下几个原因造成的: 拼写错误:首先确认模块名是否正确。通常在 Abaqus 的 Python 环境中,正确的模块名…...
【蓝桥杯】每日练习 Day7
目录 前言 领导者 分析 代码 空调 分析 代码 面包店 分析 代码 前言 今天是第一部分的最后一天(主打记忆恢复术和锻炼思维),从明天开始主播会逐步更新从位运算到dp问题的常见题型。 领导者(分类讨论) 分析 …...
贪心算法(11)(java)加油站
题目:在一条环路上有n个加油站,其中第i个加油站有汽油 gas[i]升.。 你有一辆油箱容量无限的的汽车,从第i个加油站开往第i1个加油站需要消耗汽油 cost[i]升。你从其中的一个加油站出发,开始时油箱为空。 给定…...
Python(4)Python函数编程性能优化全指南:从基础语法到并发调优
目录 一、Lambda性能优化原理1.1 内联执行优势1.2 并行计算加速 二、工程级优化策略2.1 内存管理机制2.2 类型提示增强 三、生产环境最佳实践3.1 代码可读性平衡3.2 异常处理模式 四、性能调优案例4.1 排序算法优化4.2 数据管道加速 五、未来演进方向5.1 JIT编译优化5.2 类型系…...
本地部署Stable Diffusion生成爆火的AI图片
直接上代码 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…...
qiankun微前端的使用
qiankun使用时注意以下几个点 1,子应用项目框架(react,vue)使用的打包格式需要为 umd 格式 2,子应用项目最好配置不受同源策略(跨域)的影响 3,子应用最好使用的路由模式是 histor…...
从国家能源到浙江交通投资,全息技术在能源交通领域的创新应用
一、3D全息技术行业应用参数及设计制作要求 全息投影 全息投影技术通过激光器、全息片等设备,将物体的三维信息记录下来,并在特定条件下再现。应用参数包括投影距离、投影面积、投影亮度等。设计制作要求:高清晰度、高亮度、低噪音、稳定性好…...
PageHiOffice网页组件(WebOffice文档控件)开发集成技巧专题一
PageHiOffice网页组件作为最新一代的WebOffice文档控件,这是目前市场上唯一能做到在Chrome等最新版浏览器中实现内嵌网页运行的商用文档控件,是OA及ERP等系统处理各种文档的福音。从发布到完善已经超过3年,不管是功能性还是稳定性都已经有了长…...
【人工智能】机器学习中的评价指标
机器学习中的评价指标 在机器学习中,评估指标(Evaluation Metrics)是衡量模型性能的工具。选择合适的评估指标能够帮助我们更好地理解模型的效果以及它在实际应用中的表现。 一般来说,评估指标主要分为三大类:分类、…...
本地安装deepseek大模型,并使用 python 调用
首先进入 ollama 官网 https://ollama.com/点击下载 下载完成后所有都是下一步,就可以 点击搜索 Models : https://ollama.com/search然后点击下载: 选择后复制: ollama run deepseek-r1:32b例如: 让它安装完成后࿱…...
Android:蓝牙设置配套设备配对
一、概述 在搭载 Android 8.0(API 级别 26)及更高版本的设备上,配套设备配对会代表您的应用对附近的设备执行蓝牙或 Wi-Fi 扫描,而不需要 ACCESS_FINE_LOCATION 权限。这有助于最大限度地保护用户隐私。使用此方法执行配套设备&am…...
AI知识补全(二):提示工程(Prompting)是什么?
名人说:人生如逆旅,我亦是行人。 ——苏轼《临江仙送钱穆父》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:AI知识补全(一):tokens是什么? 目录 一、什么是提示工程?二、为什么提示工程如此重要?三、核心提示工程技术1. 少样本学习(Few-Sho…...
Python 变量作用域、global 关键字与闭包作用域深度解析 第三部分
## 三、闭包作用域的存在原因及适用场景 ### 3.1 闭包作用域存在的原因 #### 3.1.1 数据封装与隐藏 闭包可以把数据封装在外部函数的作用域中,只有内部函数能够访问这些数据,这有助于实现数据的隐藏和保护。 python def counter(): count 0 def incre…...
zookeeper使用
下载 官网 链接 1. 2. 然后解压: 启动 先复制一份这个文件, 双击启动 默认占用8080,和Tomcat冲突, 解决方法:链接 然后重启...
【性能优化点滴】odygrd/quill 中一个简单的标记位作用--降低 IO 次数
在 StreamSink 类中,成员变量 _write_occurred 的作用是 跟踪自上次刷新(Flush)以来是否有写入操作发生,其核心目的是 优化 I/O 性能。以下是详细解析: _write_occurred 的作用 1. 避免不必要的刷新(Flush…...
Java面试黄金宝典11
1. 什么是 JMM 内存模型 定义 JMM(Java Memory Model)即 Java 内存模型,它并非真实的物理内存结构,而是一种抽象的概念。其主要作用是规范 Java 虚拟机与计算机主内存(Main Memory)之间的交互方式&#x…...
