Skip to content
难度基础(★)
建议时长45分钟

13.2.3 矩阵

矩阵本质上可以用二维数组存储,但特殊矩阵中有大量重复值或零值,直接存储会浪费空间。压缩存储就是只保存必要信息,再通过下标映射恢复元素位置。

特殊矩阵为什么能压缩

类型规律是否需要存全部元素
对称矩阵aij=aji不需要,只存一半加主对角线
上三角矩阵主对角线以下元素为 0 或同一常数只存上三角部分
下三角矩阵主对角线以上元素为 0 或同一常数只存下三角部分
稀疏矩阵非零元素很少只存非零元素及其位置

压缩存储的考试重点是:二维下标 (i,j) 映射到一维数组下标 k

下三角矩阵按行压缩

n×n 下三角矩阵按行优先存储,且下标从 1 开始,只存 ij 的元素。

i 行之前共有:

1+2++(i1)=i(i1)2

i 行中,A[i][j] 前面有 j-1 个元素。因此若一维数组下标从 0 开始:

k=i(i1)2+(j1)

若一维数组下标从 1 开始:

k=i(i1)2+j

上三角矩阵按行压缩

上三角矩阵只存 ij 的元素。第 i 行之前已存:

n+(n1)++(ni+2)=(i1)(2ni+2)2

i 行中,A[i][j] 是从 j=i 开始的第 j-i+1 个元素。若一维数组下标从 1 开始:

k=(i1)(2ni+2)2+(ji+1)

若题目用 0 起始下标,要整体再减 1。

对称矩阵

对称矩阵只需保存上三角或下三角。若保存下三角:

元素位置处理
ij按下三角公式直接定位
i<j利用对称性转为 A[j][i]

也就是说,访问 A[i][j] 时先判断是否在已存区域,不在就交换行列。

稀疏矩阵:三元组存储

稀疏矩阵中大部分元素为 0。如果还用二维数组存储,空间浪费严重。常用三元组保存非零元素:

行号列号
ija[i][j]

三元组适合非零元素很少、矩阵规模很大的场景。代价是随机访问某个元素不如二维数组直接,需要查找对应三元组。

压缩存储的取舍

方式优点缺点
普通二维数组访问直接,公式简单对特殊矩阵浪费空间
三角/对称压缩节省约一半空间下标映射复杂,容易算错
稀疏三元组非零元素少时极省空间随机访问和矩阵运算实现更复杂

这种“技术迭代”的本质是用计算换空间:存储更省了,但访问时需要更多映射逻辑。

本节例题

单选
下标从 1 开始的下三角矩阵中,需要存储的元素满足:

自查清单

  1. 能否推导下三角矩阵按行压缩的一维下标?
  2. 能否说明对称矩阵访问上三角元素时为什么可以交换行列?
  3. 能否判断稀疏矩阵三元组存储的优势和代价?