无向图的邻接矩阵可用一维数组存储

简介: 无向图的邻接矩阵可用一维数组存储

在无向图中,邻接矩阵是一个对称矩阵,即矩阵的第 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 开始。

这样,我们就可以仅用一个一维数组来存储无向图的邻接矩阵,节省了空间。

目录
相关文章
|
6月前
|
JavaScript 前端开发
将一维数组转树形
将一维数组转树形
|
1月前
广义表,广义表的定义和计算
广义表的定义和概念,包括空表、单元素表、嵌套子表以及如何计算广义表的长度、取表头、取表尾和计算广义表的深度。
40 1
|
5月前
|
存储
技术心得记录:图的概念和存储(邻接矩阵,邻接表)
技术心得记录:图的概念和存储(邻接矩阵,邻接表)
24 0
|
6月前
|
存储 容器
图的存储结构之打印邻接表
图的存储结构之打印邻接表
|
6月前
|
算法 C++ 开发者
【C/C++ 数据结构 】图顶点个数和边的关系
【C/C++ 数据结构 】图顶点个数和边的关系
182 0
|
6月前
|
存储 人工智能 算法
【C/C++ 数据结构 】三角矩阵的基本了解
【C/C++ 数据结构 】三角矩阵的基本了解
87 0
|
6月前
|
存储 算法 C语言
【数据结构】— —邻接矩阵和邻接表存储图结构
【数据结构】— —邻接矩阵和邻接表存储图结构
|
存储 机器学习/深度学习 人工智能
图的存储及基本操作总结(邻接矩阵、邻接表)及C/C++代码实现
图的存储及基本操作总结(邻接矩阵、邻接表)及C/C++代码实现
1284 1
|
存储 算法 索引
【霍罗维兹数据结构】GRAPH 图 | 基本图运算 DFS&BFS | 最小代价生成树
【霍罗维兹数据结构】GRAPH 图 | 基本图运算 DFS&BFS | 最小代价生成树
105 0
|
存储 机器学习/深度学习 算法
SWUST1070: 邻接矩阵存储简单路径
SWUST1070: 邻接矩阵存储简单路径
90 0