在无向图中,邻接矩阵是一个对称矩阵,即矩阵的第 i 行第 j 列元素与第 j 行第 i 列元素相同(A[i][j] = A[j][i])。由于这个性质,我们不需要存储整个 n×n 的矩阵来表示一个包含 n 个顶点的无向图。我们只需要存储矩阵的上三角部分或下三角部分。
例如,考虑一个包含 4 个顶点的无向图,其邻接矩阵可能如下所示:
0 1 2 3 0 0 1 1 0 1 1 0 1 1 2 1 1 0 1 3 0 1 1 0
在这个邻接矩阵中,我们只需要存储非对角线上方或下方的元素。对于上三角矩阵(不包括对角线),我们可以按照以下顺序存储元素:
(0,1), (0,2), (0,3), (1,2), (1,3), (2,3)
对应的一维数组就是:
1, 1, 0, 1, 1, 1
这里,我们按行优先的顺序存储了上三角矩阵中的元素。如果我们想通过一维数组来访问邻接矩阵中的元素 A[i][j] (假设 i < j),我们可以使用以下方法来计算一维数组中的索引:
index = i * (n - 1) - (i * (i + 1) / 2) + (j - i) - 1
这里,n 是顶点的数量。这个公式的理解是:
i * (n - 1)
是如果存储完整行时直到行 i 的元素数量。(i * (i + 1) / 2)
是由于我们只存储上三角部分,所以需要减去前 i 行对角线及其下方的元素数量(即前 i 行中不存储的元素数量)。(j - i)
是当前行 i 中,从对角线到我们要找的列 j 的元素数量。- 最后,我们减去 1 是因为数组索引从 0 开始。
这样,我们就可以仅用一个一维数组来存储无向图的邻接矩阵,节省了空间。