是否可以采用顺序存储结构存储图?
图的特点:顶点之间的关系是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)。若是稀疏图,则比邻接矩阵表示法合适。
邻接表的优点:
空间效率高;容易寻找顶点的邻接点;
邻接表的缺点:
判断任意两顶点间是否有弧或边,需搜索两结点(或之一)对应的单链表,没有邻接矩阵方便。
讨论:邻接表与邻接矩阵有什么异同之处?
- 联系:邻接表中每个链表对应于邻接矩阵中的一行,链表中结点个数等于一行中非零元素的个数。
- 区别:
① 对于任一确定的图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。
② 邻接矩阵的空间复杂度为O(n^2),而邻接表的空间复杂度为O(n+e)。 - 用途:邻接矩阵多用于稠密图的存储(e接近n(n-1)/2);而邻接表多用于稀疏图的存储(
e<<n^2
)
十字链表
它是有向图的另一种链式结构。
思路:将邻接矩阵用链表存储,是邻接表、逆邻接表的结合。
1、每条弧对应一个结点(称为弧结点,设5个域)
2、每个顶点也对应一个结点(称为顶点结点,设3个域)
邻接多重表
这是无向图的另一种存储结构,当对边操作时,无向图应采用此种结构存储。
1、每条边只对应一个结点(称为边结点),设立6个域;
2、每个顶点也对应一个结点(顶点结点),设立2个域;