特殊矩阵的压缩存储
含AI生成内容
特殊矩阵的压缩存储
为什么要压缩
对于 的矩阵,朴素存储要 个单元。当矩阵具有某种规律性时,朴素存储是浪费的。压缩存储的目标:只保留有用信息,并能 反算出原矩阵任一位置的值。
四类特殊矩阵的压缩:
| 矩阵 | 规律 | 压缩思路 |
|---|---|---|
| 对称矩阵 | 只存一半三角 | |
| 三角矩阵 | 一半三角全是常数 | 存非零三角 + 1 个 |
| 三对角矩阵 | 非零只在 $ | i-j |
| 稀疏矩阵 | 非零元素稀疏分布、无规律 | 存 (行, 列, 值) 三元组 |
前三类是规律性压缩,第四类是显式存位置。
对称矩阵
定义
矩阵 满足 (对所有 )。只存上三角或下三角,共 个元素。
上三角 · 行优先公式(1-based)
第 行:,共 个。
上三角 · 列优先公式(1-based)
第 列:,共 个。
下三角元素查询模板(⭐高频陷阱)
当题目”只存上三角”且要查的元素在下三角时:
- 用 交换下标
- 重新核对交换后是否进入上三角()
- 代入公式
⚠️ 易错:漏掉第一步是 2020-01 选错最常见的原因。
真题精讲:2018-03(上三角行优先)
对称矩阵 ,上三角按行优先存入一维数组 (C 语言,0-based),求 的下标。
已在 的上三角区域。代入 :
答案 50(手算验证:前 5 行共 个元素, 是第 6 行第一个)。
真题精讲:2020-01(上三角列优先 + 对称性)
对称矩阵 ,上三角按列优先存入 ,求 的下标。
第一步: 在下三角,用对称性:,查 。
第二步:代入列优先公式:
答案 22。
行优先 vs 列优先公式对比
| 行优先 | 列优先 | |
|---|---|---|
| 第 行/列长度 | (递减) | (递增) |
| “前部”求和 | ||
| 行/列内偏移 |
三角矩阵
定义
- 上三角矩阵:(下三角部分)的元素都等于同一常数
- 下三角矩阵:(上三角部分)的元素都等于同一常数
压缩策略
存非常数部分的 个元素 + 1 个常数 ,共 个。
- 非常数部分的下标公式与对称矩阵的对应三角完全相同
- 常数 单独存在末尾位置
三角矩阵 vs 对称矩阵(⭐辨析)
| 对称矩阵 | 三角矩阵 | |
|---|---|---|
| 另一半的内容 | 与存储的一半相同(重复) | 全是常数 (不同) |
| 压缩后大小 | ||
| 下标公式 | 相同 | 相同(非常数部分) |
三对角矩阵
定义
只有 的元素非零(主对角线 + 上下副对角线):
n=5 时的非零分布:* ** * * * * * * * * * *每行非零元素数
- 第 1 行:2 个 ⚠️
- 第 行:3 个
- 第 行:2 个 ⚠️
总非零数:
行优先下标公式(1-based)
中间行():
手算验证: 之前有 个元素( 到 )。第 30 行的 、、 依次占 、、。 在 → 代入公式: ✓
三个高频坑(⭐)
- 第 1 行只有 2 个元素——全部按 3 个算前缀和会错
- (主对角线)vs (上副对角线)混淆—— 在第 30 行的中间不是第一个
- 公式 只对中间行成立—— 或 时单独处理
真题精讲:2016-04
100 阶三对角矩阵 ,按行优先存入下标从 0 的一维数组 。求 的下标。
代入 (属于 的常规行):
答案 87。
稀疏矩阵
定义
非零元素个数 远小于矩阵总元素数 ,且分布无规律。
三元组表
对每个非零元素存一个三元组 :
typedef struct { int rows; // 原矩阵的行数 int cols; // 原矩阵的列数 int nums; // 非零元素个数 Triple data[N]; // 三元组数组} TSMatrix;除三元组本身外,还需存储原矩阵的行数和列数(不是非零行列数)。仅存非零行列数会丢失零元素的行/列信息,无法还原矩阵形状。
真题精讲:2023-03
采用三元组表存储稀疏矩阵 M,除三元组外还需保存的是? I. M 的行数 II. M 中包含非零元素的行数 III. M 的列数 IV. M 中包含非零元素的列数
正确答案:I 和 III(原矩阵的行数和列数)。
反例: 矩阵只有 ,三元组为 。非零行数 II=1,非零列数 IV=1。如果只存 II+IV,重建出来是 矩阵,原矩阵的 4 行 4 列零元素信息全部丢失。
十字链表
适合频繁修改的稀疏矩阵。每个非零元素是一个节点,同时挂在所在行链表和列链表上:
typedef struct OLNode { int row, col; ElemType value; struct OLNode *right; // 同一行内下一个非零元素 struct OLNode *down; // 同一列内下一个非零元素} OLNode;优势:插入/删除 ,不需要移动其它元素。
三元组 vs 十字链表
| 三元组表 | 十字链表 | |
|---|---|---|
| 存储开销 | 小(3 个值) | 大(多 2 个指针) |
| 插入/删除 | 慢(数组移位) | 快(链表操作) |
| 适用场景 | 静态矩阵 | 频繁修改 |
邻接矩阵不是稀疏矩阵的压缩结构(⭐辨析)
邻接矩阵的”矩阵”二字容易误判为”与稀疏矩阵相关”。它就是一个普通的 二维数组,完全不压缩,0 元素照常占内存。稀疏图的邻接矩阵用三元组或十字链表压缩才高效。
四类矩阵对比速查
| 矩阵 | 非零分布 | 压缩后大小 | 关键公式(0-based 行优先) |
|---|---|---|---|
| 对称矩阵(上三角) | |||
| 对称矩阵(上三角列优先) | |||
| 三角矩阵 | 一半 + 1 个常数 | 同对称矩阵对应三角 | |
| 三对角矩阵 | (中间行) | ||
| 稀疏矩阵(三元组) | 任意稀疏 | 显式存 | |
| 稀疏矩阵(十字链表) | 任意稀疏 | 链表节点 |
考研高频考点
- ⭐ 对称矩阵压缩下标公式(选择题必考)
- ⭐ 下三角元素用对称性转换后查上三角公式(2020-01 陷阱)
- ⭐ 三对角矩阵下标公式 (2016-04)
- ⭐ 三对角矩阵第 1 行只有 2 个元素的边界处理
- ⭐ 稀疏矩阵三元组需存原矩阵行数和列数(2023-03)
- 三角矩阵 vs 对称矩阵的概念辨析
- 三元组 vs 十字链表的适用场景选择
- 邻接矩阵不是稀疏矩阵的压缩结构(2017-03)
关联页面
- 多维数组的存储 — 数组存储基础知识
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!










