8.2 图的存储方式

1,139 阅读2分钟

这篇文章介绍图的两种存储方式:邻接矩阵与邻接表。

在图的存储方式中,不管是哪一种,存储的都是图的顶点信息以及顶点间的关系。

邻接矩阵

邻接矩阵使用两个数组存储图。

  • 顶点数组:一维数组 VERTEX,存放顶点的数据信息。如 VERTEX = [v1, v2, v3]
  • 邻接矩阵:二维数组 A,下标表示顶点,元素表示顶点之间的关系。对于 A[i][j] 而言,存储的元素代表 VERTEX 中顶点 i 与顶点 j 间的边的信息。

一般而言,在无权图的邻接矩阵中,如果顶点间有边时,存储元素为 1,无边存放 0。如无向图 G1 和有向图 G2 的表示方法如下,它们的边都没有权重:

而对于网络(带权图)来说,邻接矩阵元素为边上的权值 w_{ij},当无边时,可以用无穷大 ∞ 表示。

邻接矩阵的存储方式有如下特点:

1、无向图的邻接矩阵一定是对称矩阵。按压缩存储的思想,我们可以只用存储上三角或下三角元素。 2、无向图的第 i 行或第 i 列非零元素(或非 ∞ 元素)个数正好是第 i 个顶点的度。 3、有向图的第 i 行或第 i 列非零元素(或非 ∞ 元素)个数正好是第 i 个顶点的出度或入度。

需要重点提出是它与邻接表存储方式的区别:

使用邻接矩阵很容易确认两个顶点间是否存在边,但确认一共多少边必须遍历所有元素,代价较大。 对于 n 个顶点的图,存储邻接矩阵需要 n * n 个存储位置,空间复杂度为 n^2。所以适合稠密图的存储,而不适合稀疏图。

邻接表

邻接表使用顺序存储与链式存储相结合。

  • 数组:存放顶点的数据信息。
  • 链表:存放边的信息。

邻接表首先由一个数组,存放了所有的顶点结点,以每一个顶点结点作为头结点,又有 n 个链表,分别存放每个顶点依附的边。

同样是上面的 G1、G2 两张图,使用邻接表存储如下:

边结点里的序号指代的是顶点在顶点数组中间的索引。

对于网络来讲,边结点还需存储边的权重。