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 的二维数组。邻接矩阵存储方式通过二维数组表示图的结构:

  1. 顶点信息:使用一维数组存储图中所有顶点的信息。
  2. 边信息:使用二维数组(邻接矩阵)存储顶点之间的邻接关系。

若顶点编号为 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 表示无边。
    在这里插入图片描述

顶点的度计算

  1. 无向图:顶点 v i v_i vi 的度 TD ( v i ) \text{TD}(v_i) TD(vi) 等于邻接矩阵第 i i i 行(或第 i i i 列)非零元素个数。
  2. 有向图
    • 出度 OD ( v i ) \text{OD}(v_i) OD(vi):第 i i i 行非零元素个数。
    • 入度 ID ( v i ) \text{ID}(v_i) ID(vi):第 i i i 列非零元素个数。

邻接矩阵的特点

  1. 有向图与无向图的区别
    • 有向图的邻接矩阵可能不对称。
    • 无向图的邻接矩阵是对称矩阵。
  2. 空间复杂度:顶点数为 n n n 时,邻接矩阵的空间复杂度为 O ( n 2 ) O(n^2) O(n2),适合稠密图。
  3. 二维数组的行和列对应顶点的编号,矩阵元素表示顶点间的连接关系。
    • 例如,矩阵中第 i i i 行第 j j j 列的值表示顶点 v i v_i vi v j v_j vj 是否存在边或边的权重。
  4. 邻接矩阵的遍历时间复杂度:基于邻接矩阵的遍历(如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):指向下一条边的边表结点。
      在这里插入图片描述
  • 无向图和有向图的邻接表的实例
    在这里插入图片描述
    在这里插入图片描述

邻接表的特点

  1. 存储空间
    • 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)
  2. 稀疏图的存储
    • 对于稀疏图(即边数较少的图),采用邻接表表示将极大地节省存储空间。
  3. 操作效率
    • 在邻接表中,给定一个顶点,能很容易地找出它的所有邻边,因为只需要读取它的邻接表。
    • 在邻接矩阵中,相同的操作则需要扫描一行,花费的时间为 O ( n ) O(n) O(n)。但是,若要确定给定的两个顶点间是否存在边,则在邻接矩阵中可以立刻查到,而在邻接表中则需要在相应结点对应的边表中查找另一结点,效率较低。
  4. 顶点的度
    • 在无向图的邻接表中,求某个顶点的度只需计算其邻接表中的边表结点个数。
    • 在有向图的邻接表中,求某个顶点的出度只需计算其邻接表中的边表结点个数;但求某个顶点 x x x 的入度则需遍历全部的邻接表,统计邻接点(adjvex)域为 x x x 的边表结点个数。
  5. 邻接表的唯一性
    • 图的邻接表表示并不唯一,因为在每个顶点对应的边表中,各边结点的链接次序可以是任意的,它取决于建立邻接表的算法及边的输入次序。

邻接矩阵和邻接表的适用性差异

  • 对于稀疏图,邻接表法比邻接矩阵法更节省存储空间。
  • 在邻接表中,给定顶点查找其所有邻边的效率较高,但在邻接矩阵中,确定两个顶点间是否存在边的效率更高。

十字链表

十字链表定义

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

十字链表结构

  • 弧结点

    • 有 5 个域:tailvexheadvexhlinktlinkinfo
      • tailvexheadvex 两个域分别指示弧尾和弧头这两个顶点的编号。
      • hlink 指向弧头相同的下一个弧结点。
      • tlink 指向弧尾相同的下一个弧结点。
      • info 存放该弧的相关信息。
    • 弧头相同的弧在同一个链表上,弧尾相同的弧也在同一个链表上。
      在这里插入图片描述
  • 顶点结点

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

在这里插入图片描述

  • 顶点结点之间是顺序存储的,弧结点省略了 info 域。
    在这里插入图片描述

十字链表的特点

  • 在十字链表中,既容易找到 V i V_i Vi 为尾的弧,也容易找到 V i V_i Vi 为头的弧,因而容易求得顶点的出度和入度。
  • 图的十字链表表示不是唯一的,但一个十字链表表示唯一确定一个图。

十字链表的适用性

  • 十字链表适合用于有向图的存储,能够有效地表示和操作有向图的边和顶点。

邻接多重表

邻接多重表定义

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

邻接多重表结构

  • 每条边用一个结点表示,其结构如下所示:
    • ivexjvex 这两个域指示该边依附的两个顶点的编号;
    • 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王道考研书

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

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

相关文章

以高斯(GaussDB) 为例, 在cmd 命令行连接数据,操作数据库,关闭数据库的详细步骤

以下是使用 Windows 命令行&#xff08;cmd&#xff09; 操作 GaussDB&#xff08;以 GaussDB(for openGauss) 社区版为例&#xff09; 的详细步骤&#xff0c;涵盖 连接数据库、基本操作、关闭数据库 的全流程&#xff1a; 1. 环境准备 前提条件&#xff1a; 安装 GaussDB&a…

HAL库定时器配置

定时器的开启需要手动开启&#xff0c;例如在driver_capature.c开启&#xff0c;该文件主要写了具体的函数实现&#xff0c;与driver_can.c一样&#xff0c;同时还有回调函数等一些高级的自定义函数。 这段代码是 STM32 HAL 库中用于初始化 定时器 2 (TIM2) 的函数 MX_TIM2_In…

使用Python开发自动驾驶技术:车道线检测模型

友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…

Modern C++面试题及参考答案

目录 解释右值引用的定义及其与左值引用的核心区别 std::move 的实现原理是什么?为什么它本身不执行移动操作? 移动构造函数与拷贝构造函数的调用场景有何不同? 实现一个支持移动语义的类需要遵循哪些原则? 完美转发(Perfect Forwarding)的实现原理及 std::forward 的…

Thinkphp(TP)框架漏洞攻略

1.环境搭建 vulhub/thinkphp/5-rce docker-compose up -d 2.访问靶场 远程命令执行&#xff1a; ? sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1] []whoami 远程代码执行&#xff1a; ? s/Index/\think\app/invokefunc…

QT笔记---JSON

QT笔记---JSON JSON1、JSON基本概念1.1、判断.json文件工具 2、生成.json数据3、解析.json数据 JSON 在现代软件开发中&#xff0c;数据的交换和存储格式至关重要。JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;以其简洁易…

Unity 使用 Protobuf(Pb2)二进制数据全流程工具详解

前言 在Unity游戏开发中&#xff0c;高效、快速、安全地读取配置数据是一项重要需求。本文介绍一种完整的解决方案——使用Protobuf二进制格式&#xff08;Pb2&#xff09;存储和读取游戏数据&#xff0c;并详细分享实现全流程的Unity工具。 一、技术流程概览 实现Unity读取…

MySQL-----视图与索引

目录 视图 1.视图 2.操作 11.索引 1.定义 2.优缺点: 3.分类 4.索引的设计原则 5.索引的使用 作业 视图 1.视图 ❓如果需要在原表中隐藏部分字段时&#xff0c;怎么办&#xff1f; 视图 &#x1f4d6;视图: 是一个没有存储任何数据的表&#xff0c;可以对其CRUD视图…

stm32-IIC

i^2c,iiCBus,集成电路总线&#xff0c;同步串行半双工通信总线方式 sck:时钟同步信号 SDA:发送数据 GND&#xff1a;接地 通信对象&#xff1a;芯片与芯片 主从应答方式&#xff1a; SDA&#xff1a;数据总线 SCL&#xff1a;时钟总线 在硬件设计中&#xff1a; 上拉电阻&#…

`chromadb` 是什么

chromadb 是什么 chromadb 是一个开源的向量数据库,它专门用于存储、索引和查询向量数据。在处理自然语言处理(NLP)、计算机视觉等领域的任务时,通常会将文本、图像等数据转换为向量表示,而 chromadb 可以高效地管理这些向量,帮助开发者快速找到与查询向量最相似的向量数…

机器视觉工程师如何看机器视觉展会,有些机器视觉兄弟参加机器视觉展会,真的是参加了?重在参与?

作为机器视觉工程师,参加机器视觉展会不仅是了解行业前沿技术的窗口,也是拓展专业网络、寻找解决方案的重要机会。以下是结合展会信息和工程师视角的综合建议: 一、聚焦技术趋势与创新应用 参与技术论坛与研讨会 展会同期的技术论坛是获取行业洞见的核心渠道。例如: 上海展…

Centos操作系统安装及优化

Centos操作系统安装及优化 零、环境概述 主机名 centos版本 cpu 内存 Vmware版本 ip地址 test CentOS Linux release 7.6.1810 (Core) 2C 2G 15.5.1 10.0.0.10 一、介质下载 1、7.6版本下载 CentOS7.6标准版下载链接: https://archive.kernel.org/centos-vault/7.6.1810/i…

Edge浏览器如何默认启动某个工作区 / 为工作区添加快捷方式

Edge浏览器的工作区确实非常好用&#xff0c;可以多端同步标签页。但是打开Edge时默认是没有在工作区的状态&#xff0c;这个状态下的标签页可能会丢失。所以我研究了一下&#xff0c;如何点击快捷方式时自动启动一个工作区&#xff0c;方法如下&#xff1a; 先找到WorkspaceCa…

mac上安装nvm及nvm的基本语法使用!!

种一棵树&#xff0c;最好是十年前&#xff0c;其次是现在&#xff01;想要改变&#xff0c;从此刻开始&#xff0c;一切都不晚&#xff01; 目录 nvm是什么&#xff1f;前提条件&#xff1a;安装homebrew如果系统已经有node版本&#xff1a;在mac上安装nvm&#xff1a;用nvm安…

CPP中的numeric库中的accumulate求和函数说明

导入 accumulate函数位于numeric库中&#xff0c;作用是对数组或向量求和 // 设定初始值为0&#xff0c;从dp[0]到dp[n-1]进行累加 accumulate(dp,dpn,0);注意&#xff1a;这里的第二个参数是开区间&#xff0c;所以求和时不包含dp[n]这一位

Qt 高效读写JSON文件,玩转QJsonDocument与QJsonObject

一、前言 JSON作为轻量级的数据交换格式&#xff0c;已成为开发者必备技能。Qt框架为JSON处理提供了完整的解决方案&#xff0c;通过QJsonDocument、QJsonObject和QJsonArray三大核心类&#xff0c;轻松实现数据的序列化与反序列化。 JSON vs INI 特性JSONINI数据结构支持嵌…

Kubernetes(k8s)-Pod亲和性(Affinity)和反亲和性(Anti-affinity)

作者介绍&#xff1a;简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Docker基本情况&#xff0c;目前在规模较大的容器集群基本都是Kubernetes&#xff0c;但是K…

ESP32-C3物联网方案,智能设备创新升级,无线交互控制通信应用

在物联网技术迅猛发展的今天&#xff0c;各类智能设备如雨后春笋般涌现&#xff0c;深度融入我们生活与工作的各个角落&#xff0c;物联网正以一种前所未有的速度改变着我们的世界。 想象一下&#xff0c;清晨&#xff0c;当第一缕阳光洒进房间&#xff0c;智能窗帘自动缓缓拉…

Python自动化测试 之 DrissionPage 的下载、安装、基本使用详解

Python自动化测试 之 DrissionPage 使用详解 &#x1f3e1;前言&#xff1a;一、☀️DrissionPage的基本概述二、 &#x1f5fa;️环境安装2.1 ✅️️运行环境2.2 ✅️️一键安装 三、&#x1f5fa;️快速入门3.1 页面类&#x1f6f0;️ChromiumPage&#x1f6eb; SessionPage&…

【操作系统安全】任务3:Linux 网络安全实战命令手册

目录 一、基础网络信息获取 1. 网络接口配置 2. 路由表管理 3. 服务端口监控 二、网络监控与分析 1. 实时流量监控 2. 数据包捕获 3. 网络协议分析 三、渗透测试工具集 1. 端口扫描 2. 漏洞利用 3. 密码破解 四、日志审计与分析 1. 系统日志处理 2. 入侵检测 3…