【数据结构】图的存储结构

是否可以采用顺序存储结构存储图?

图的特点:顶点之间的关系是m:n,即任何两个顶点之间都可能存在关系(边),无法通过存储位置表示这种任意的逻辑关系,所以,图无法采用顺序存储结构。

如何存储图?

考虑图的定义,图是由顶点和边组成的,分别考虑如何存储顶点、如何存储边。

邻接矩阵(数组)表示法

基本思想:用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系。

假设图A=(V,E)有n个顶点,则邻接矩阵是一个n×n的方阵,定义为:

图示

图示

分析1:无向图的邻接矩阵是对称的;
分析2:顶点i 的度=第 i 行 (列) 中1 的个数;
特别:完全图的邻接矩阵中,对角元素为0,其余全1。

图示

注:在有向图的邻接矩阵中,
第i行含义:以结点vi为尾的弧(即出度边);
第i列含义:以结点vi为头的弧(即入度边)。

图示

特别讨论 :网(即有权图)的邻接矩阵

图示

邻接矩阵的优点:容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。

邻接矩阵的缺点:n个顶点需要n*n个单元存储边(弧);空间效率为O(n^2)。 对稀疏图而言尤其浪费空间。

邻接表(链式)表示法

对每个顶点vi 建立一个单链表,把与vi有关联的边的信息(即度或出度边)链接起来,表中每个结点都设为3个域;

图示

图示

邻接表存储法的特点:—它其实是对邻接矩阵法的一种改进

对于n个顶点e条边的无向图,邻接表中除了n个头结点外,只有2e个表结点,存储规模为n+2e,空间复杂度为O(n+e)。若是稀疏图(e<<n^2),则比邻接矩阵表示法O(n^2)省空间。

怎样计算无向图顶点的度?TD(Vi)=单链表中链接的结点个数

在有向图中,邻接表中除了n个头结点外,只有e个表结点,存储规模为n+e,空间复杂度为O(n+e)。若是稀疏图,则比邻接矩阵表示法合适。

图示

邻接表的优点:

空间效率高;容易寻找顶点的邻接点;

邻接表的缺点:

判断任意两顶点间是否有弧或边,需搜索两结点(或之一)对应的单链表,没有邻接矩阵方便。

讨论:邻接表与邻接矩阵有什么异同之处?

  1. 联系:邻接表中每个链表对应于邻接矩阵中的一行,链表中结点个数等于一行中非零元素的个数。
  2. 区别:
    ① 对于任一确定的图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。
    ② 邻接矩阵的空间复杂度为O(n^2),而邻接表的空间复杂度为O(n+e)。
  3. 用途:邻接矩阵多用于稠密图的存储(e接近n(n-1)/2);而邻接表多用于稀疏图的存储(e<<n^2)

十字链表

它是有向图的另一种链式结构。

思路:将邻接矩阵用链表存储,是邻接表、逆邻接表的结合。

1、每条弧对应一个结点(称为弧结点,设5个域)
2、每个顶点也对应一个结点(称为顶点结点,设3个域)

图示

图示

邻接多重表

这是无向图的另一种存储结构,当对边操作时,无向图应采用此种结构存储。

1、每条边只对应一个结点(称为边结点),设立6个域;
2、每个顶点也对应一个结点(顶点结点),设立2个域;

图示

图示

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值