数据结构--图的存储(邻接矩阵、邻接表、十字链表、邻接多重表)

目录

邻接矩阵

邻接矩阵定义

 用邻接矩阵法求顶点的度/出度/入度​编辑

 邻接矩阵法存储带权图(网)​编辑

邻接矩阵法的性能分析 

 邻接矩阵法的性质

 回顾整理邻接矩阵​编辑

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

邻接表的存储方式

如何求顶点的度/入读/出度

​编辑

回顾重要知识点 

十字链表

 十字链表法的存储方式

​编辑

十字链表法的性能分析

邻接多重表

邻接多重表存储方式

 回顾知识点


 

邻接矩阵

邻接矩阵定义

所谓邻接矩阵存储是指用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息各顶点之间的邻接关系。存储顶点之间的邻接关系的二维数组称为邻接矩阵

对于带权图而言,若顶点Vi和Vj之间有边相连,则邻接矩阵中对应项存放着该边对应的权值。若顶点Vi和Vj不相连,则通常用无穷来表示这两个顶点之间不存在边。

 

 用邻接矩阵法求顶点的度/出度/入度

 

 邻接矩阵法存储带权图(网)

 

邻接矩阵法的性能分析 

 

 邻接矩阵法的性质

 

 

 回顾整理邻接矩阵

  • 在简单应用中,可直接用二维数组作为图的邻接矩阵。(顶点信息等均可省略)。
  • 当邻接矩阵的元素仅表示相应边是否存在时。 EdgeType可采用值为0和1的枚举类型。
  • 无向图的邻接矩阵是对称矩阵。对规模特大的邻接矩阵,可采用压缩存储
  • 邻接矩阵表示法的空间复杂度为O(n^2),其中n为图的顶点数|V|。 

 注意:图的邻接矩阵存储表示法具有以下特点

  • 无向图的邻接矩阵一定是一个对称矩阵,并且唯一,因此在存储邻接矩阵时,只需要存储上(或下)三角矩阵的元素。
  • 对于无向图,邻接矩阵的第i行(或者是第i列)非零元素(或非无穷元素)的个数正好是顶点i的度。
  • 对于有向图邻接矩阵的第i行非零元素(或非无穷元素)的个数,正好是顶点i的出度OD(Vi)第i列非零元素(或非无穷元素)的个数正好是顶点i的入度ID(Vi)
  • 用邻接矩阵存储图,很容易确定图中任意两个顶点之间是否有边相连,但是要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。
  • 稠密图适合使用邻接矩阵的存储表示。

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

邻接表的存储方式

当一个图文稀疏图时,使用邻接矩阵法显然要浪费大量的存储空间,而图的邻接表法结合了顺序存储和链式存储方法,大大减少了这种不必要的浪费。

所谓邻接表,是指对图G中的每个顶点Vi建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边,(对于有向图,则是以顶点Vi为尾的弧)。这个单链表就称为顶点Vi的边表。(对于有向图,则称为出边表)。边表的头指针和顶点的数据信息采用顺序存储,称为顶点表,所以在邻接表中存在两种结点:顶点表结点和边表结点。

 

 类比树的孩子表示法

 

如何求顶点的度/入读/出度

对于无向图。直接遍历和某个顶点对应的边链表。有几个边结点,则这个顶点对应的度就是多少。遍历边链表,也可知道和这个顶点相连的所有边。

对于有向图,度=出度+入度。

找出度的方式:直接遍历对应顶点的边节点的链表。(因为有向图中链表是代表某个顶点发射出去的弧。

找入度的方法(即指向当前结点的弧)。就是把所有结点的边链表都遍历一遍,找到这个顶点在顶点集的序号和它的链表同样也是这个序号的结点

 

注意:

使用邻接表存储,每条边对应两份冗余信息,删除顶点、删除边等操作时间复杂度高

对于邻接矩阵法来说,空间复杂度很高。O(|V|^2)

回顾重要知识点 

 

 

十字链表

 

 十字链表法的存储方式

 十字链表法只存储有向图

 

 

十字链表法的性能分析

 

邻接多重表

邻接多重表只用来存储无向图

邻接多重表存储方式

 

 

 回顾知识点

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值