图的存储及基本操作

邻接矩阵法

  1. 邻接矩阵:所谓邻接矩阵法,就是用一个一维数组表示顶点集,一个二维数组表示边集,这个存储边的的信息(顶点间邻接关系)的矩阵就是邻接矩阵,其空间复杂度为 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)
  2. 邻接矩阵既可以存储无向表,可以存储有向表,也可以存储无向网和有向网

邻接矩阵法的特点

  1. 无向图的邻接矩阵一定是一个对称矩阵,且矩阵唯一
  2. 对于无向图,其邻接矩阵第 i i i行(或第 i i i列)非零元素的个数即为顶点 i i i的度
  3. 对于有向图,其邻接矩阵第 i i i行非0或非无穷元素的个数即为顶点 i i i的出度;第 i i i列非零或非无穷元素的个数即为顶点 i i i的入度
  4. 设图 G G G的邻接矩阵为 A A A, A n A^n An的元素 A n [ i ] [ j ] A^n[i][j] An[i][j]表示从顶点 i i i到顶点 j j j的长度为 n n n的路径的数目(了解即可)

邻接矩阵的优缺点

优点:

  1. 适合存储稠密图
  2. 且邻接矩阵可以在 O ( 1 ) O(1) O(1)的时间内很方便的查找到两个顶点间是否有边;

缺点:

  1. 需要 O ( n 2 ) O(n^2) O(n2)的时间才能判断整个图有多少条边;
  2. 需要 O ( n ) O(n) O(n)的时间才能判断某个顶点邻接的边,不如邻接表快

邻接表法

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

顶点表结点

顶点表结点由两部分组成:顶点域、边表头指针,分别存储顶点的数据信息和边表的头指针地址

边表结点

边表结点由两部分组成:邻接点域和指针域,分别存储与对应顶点邻接的顶点和指向下一个与其邻接的顶点的指针

邻接表的特点

  1. 若G为无向图,则其所需要的存储空间为 O ( ∣ V ∣ + 2 ∣ E ∣ ) O(|V|+2|E|) O(V+2E),因为每条边都被存储了两次
  2. 若G为有向图,则其所需要的存储空间为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(V+E)
  3. 图的邻接表表示并不唯一,因为边表中的结点可以互换位置

邻接表的优缺点

优点:

  1. 适合存储稀疏图
  2. 给定一顶点,可以很快速的找到其所有邻边
  3. 对于有向表,可以很轻松的判断出对应结点的出度

缺点:

  1. 若要判断两顶点间是否有边,则需要遍历对应顶点的整个边表,不如邻接矩阵的 O ( 1 ) O(1) O(1)
  2. 对于有向表,计算对应结点的入度需要遍历整个邻接表

十字链表

  1. 十字链表是用来存储有向表的一种链式存储结构
  2. 在十字链表中,每个顶点和每条弧都对应一个结点
  3. 图的十字链表表示是不唯一的,但是一个十字链表唯一对应一张图
  4. 十字链表能很方便的找到对应顶点的出度和入度

弧结点

十字链表的弧结点一般包含如下五个部分:

名称含义
tailvex弧尾所在顶点
headvex弧头所在顶点
hlink指向弧头相同的下一条弧
tlink指向弧尾相同的下一条弧
info存储弧的权值等信息,可省略

顶点结点

顶点结点一般包含三个部分:

名称含义
data存储顶点数据
firstin以该顶点为弧头的第一条弧
firstout以该顶点为弧尾的第一条弧

邻接多重表

1.邻接多重表是无向图的一种存储结构,其中每条边和每个顶点都用一个结点表示

边结点

名称含义
mark标记该条边是否被搜索过
ivex该边依附的一个顶点 i i i
ilink指向同样依附于顶点 i i i的下一条边
jvex该边依附的一个顶点 j j j
jlink指向同样依附于顶点 j j j的下一条边

顶点结点

名称含义
data该顶点的数据
firstedge指向依附于该顶点的第一条边
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值