摘要:

1,图的存储介绍

2,邻接矩阵

3,邻接表

4,边集数组

5,十字链表

6,邻接多重表

1,图的存储介绍:

图的存储方式比较多,有邻接矩阵,邻接表,边集数组,十字链表,邻接多重表。其中邻接矩阵,邻接表,边集数组即可用于有向图也可用于无向图。十字链表是专门针对有向图设计的存储结构。邻接多重表是无向图的一种优化存储结构,类似于十字链表的结构。

2,邻接矩阵(Adjacency Matrix)

对于一个有 n 个顶点的图,可以使用一个 n*n 的矩阵来表示,矩阵中每个元素的值表示两个顶点之间是否存在边。如果两点之间没有边,则使用 0 表示。如果两点之间有边,对于非加权图来说可以使用 1 表示,对于加权图来说可以使用权值表示。

如下图所示,对于加权无向图,如果顶点 i 和顶点 j 相连,那么[i][j]的值就是这条边的权值。如果顶点 i 和顶点 j 不相连,[i][j]的值就是 0 。

打开网易新闻 查看更多图片

我们发现对于无向图来说,无论是加权的还是非加权的,他们都是关于左上角到右下角这条直线对称的。这是因为在无向图中,如果顶点 i 和顶点 j 相连,那么顶点 j 和顶点 i 也是相连的,即[i][j]和[j][i]是相等的。

对于有向图来说是没有对称轴的,因为有向图的边是有方向的,如果顶点 i 指向顶点 j ,但顶点 j 不一定指向顶点 i ,也就是[i][j]和[j][i]不一定相等。

无论是加权有向图和非加权有向图,我们可以看到在矩阵中 [i][?] 不为 0 的个数就是顶点 i 的出度,[?][j] 不为 0 的个数是顶点 j 的入度。

打开网易新闻 查看更多图片

邻接矩阵的优点:

1,这种方式直观、简单,适用于稠密图(边的数量接近顶点数量平方的图),但对于稀疏图会浪费较多空间。

2,可以快速判断两个顶点之间是否存在边(O(1) 时间复杂度)。

邻接矩阵的缺点: