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

6.2.2邻接表法-图的存储

知识总览:

为什么要用邻接表

因为邻接矩阵的空间复杂度高(O(n²)),且不适合边少的稀疏图,所以有了邻接表 

用代码表示顶点、图

声明顶点+图信息

声明顶点用一维数组存储各个顶点的信息,一维数组字段包括2个,每个顶点的数据域信息和指向该顶点的第一条边或弧的信息,声明图:一维数组+该图目前有多少顶点vexnum+改图目前有多少边arcnum

无向图邻接表:

如下图中的data字段上的0、1、2、3、4、5是一维数组的索引,每个data字段都有一个first指针,为指向该顶点的第一条边的指针,虽然指针就一个,但是指向的节点可能有多个,就看这个节点和其他节点有几条边,first指针指向该节点指向的下一个节点信息,节点信息包括该条边指向的节点,如A和B、A和C、A和D都相邻,都有边,都有路径,那first指针指向的节点信息中的是B、C、D,这些节点信息都在一维数组中,每个节点信息都有编号,于是first指针就指向了编号,如B的编号为1,C的编号是2,D的编号是3,所以指向第一条边那依次指向1、2、3(3,2,1的位置也可互换,即邻接表的表示方式不唯一 ,但是邻接矩阵的表示方式唯一),即有一条A指向B或者说指向1的边,A指向C或者说指向2的边,A指向D或者说指向3的边。如果是带权图,还可以在边指向的节点信息中加上权值信息InfoType type字段

因为是无向图,一条边就要在2个节点VNode的first指针存储2个边节点信息。A指向B就意味着B指向A,所以A节点中first指针B,B节点first指针要指向A节点,但是是同一个边,即1个边对应了2个节点,所以有边节点的数量是2|E|即边节点=2倍边的数量

无向图中空间复杂度=顶点的占用空间+2倍边的空间=O(|v|+2|E|)(应该是就存储顶点信息+first指针吧,first指针又存储了边节点,边节点又和边的数量有关系,所以实际是存储的边节点信息。。。)

无向图的度=该节点下first指针中边节点的个数(度是针对节点来说的)

有向图邻接表:

有向图中一条边只会在一个VNode节点信息上指向边节点,即A指向B这条边,只会在A节点的first指针上指向边节点B,不会在B节点的first指针指向A,即边的数量=指向边节点的数量

有向图空间复杂度=顶点的占用空间+边的空间=O(|v|+|E|)

有向图的度=入度+出度(度是针对节点来说的)

有向图的出度=每个节点的first指针指向的边节点的个数(因为first指针指向的是从该节点指向的其他节点)

有向图的入度=遍历所有的节点信息,看看哪个节点上的first指针下有该节点的和(如A节点的入度就是遍历所有的节点,看看哪个节点的first指针下有边节点A,有A的数量之和即为入度),因为求入度要遍历所有节点,所以时间开销大

知识回顾

未完待续。。。。。。。 

相关文章:

  • PWM讲解+STM32任意频率、占空比、脉宽生成函数介绍
  • boost之signal2
  • 代码上传gitte仓库
  • 本地无损放大软件-realesrgan-gui
  • 人工智能100问☞第26问:什么是贝叶斯网络?
  • Python 条件语句详解
  • Postgres mcp server
  • Text models —— BERT,RoBERTa, BERTweet,LLama
  • java中的Servlet1.x详解
  • Python训练第二十九天
  • DeepSeek系列核心技术与贡献总结
  • PointNet++:点云处理的升级版算法
  • 最长递增子序列
  • C2S-Scale方法解读
  • 信奥赛-刷题笔记-栈篇-T2-P3056括号调整问题0518
  • LeetCode算 法 实 战 - - - 双 指 针 与 移 除 元 素、快 慢 指 针 与 删 除 有 序 数 组 中 的 重 复 项
  • LeetCode 394. 字符串解码详解:Java栈实现与逐行解析
  • 【甲方安全建设】Python 项目静态扫描工具 Bandit 安装使用详细教程
  • 【QGIS二次开发】空间分析-10
  • 力扣1991:找到数组的中间位置(前缀和)
  • 深一度|上座率连创纪录撬动文旅,中超可否复制大连模式
  • 远洋渔船上的命案
  • 一周观展|一批重量级考古博物馆开馆:从凌家滩看到孙吴大墓
  • AG600“鲲龙”批生产首架机完成生产试飞
  • 2025全球城市科技传播能力指数出炉,上海位列第六
  • 世界高血压日|专家:高血压患者控制血压同时应注重心率管理