首页/数据结构/03-stack-queue-array/特殊矩阵的压缩存储 🔗 在 Obsidian 中打开
数据结构 · 03-stack-queue-array

特殊矩阵的压缩存储

难度 ★★★重要度 ★★★★ 考查频率 高题型 选择 / 计算 数组对称矩阵三对角三元组
速查
对称矩阵只存下三角 n(n+1)/2 个;三对角矩阵存 3n−2 个;稀疏矩阵用三元组表十字链表。地址映射是考查重点。

核心概念

一、对称矩阵

定义

n 阶方阵 A 满足 $ a_{ij} = a_{ji} $($ 1 \le i, j \le n $)。

特点

  • 关于主对角线对称
  • 只需存储下三角(或上三角)部分

压缩存储

用一维数组存储下三角(含对角线)元素:

  • 元素个数:$ n(n+1)/2 $
  • 存储空间:$ n(n+1)/2 $ 个存储单元

地址映射公式(按行优先存下三角)

当 $ i \ge j $(下三角)

$$k = \frac{i(i-1)}{2} + (j-1) = \frac{i(i-1)}{2} + j - 1$$

当 $ i < j $(上三角),利用 $ a_{ij} = a_{ji} $:

$$k = \frac{j(j-1)}{2} + i - 1$$
记忆口诀行列号大的做"行",小的做"列":令 $ \max(i,j) $ 做行号,$ \min(i,j) $ 做列号。

地址计算:$ LOC(a_{ij}) = LOC(a_{11}) + k \times sizeof(ElemType) $。

二、三角矩阵

1. 上三角矩阵

下三角全为常数 c(或 0)。压缩存储上三角 + 一个常数 c,元素个数 $ n(n+1)/2 + 1 $。

上三角元素 $ a_{ij} $($ i \le j $)下标:

$$k = \frac{(i-1)(2n-i+2)}{2} + (j-i)$$

2. 下三角矩阵

上三角全为常数 c。下三角元素 $ a_{ij} $($ i \ge j $):

$$k = \frac{i(i-1)}{2} + (j-1)$$

与对称矩阵下三角公式相同;常数统一映射到最后一个位置。

三、三对角矩阵(带状矩阵)

定义

只有主对角线及其上下各一条对角线有非零元素。

特点

  • 每行最多 3 个非零元素(第 1 行和第 n 行 2 个)
  • 非零元素总数:$ 3n - 2 $

地址映射

当 $ |i-j| \le 1 $ 时:

$$k = 2(i-1) + (j-1) = 2i + j - 3$$

反向映射(已知 k 求 i,j):

$$i = \left\lfloor \frac{k+1}{3} \right\rfloor + 1,\quad j = k - 2(i-1) + 1 = k - 2i + 3$$

四、稀疏矩阵

定义

非零元素个数远小于元素总数(通常 $ t < 0.05 \times m \times n $)。

1. 三元组表

typedef struct {
    int i, j;       // 行号、列号
    ElemType val;   // 元素值
} Triple;

typedef struct {
    Triple data[MAXSIZE+1];  // data[0]未用或存矩阵信息
    int mu, nu, tu;          // 行数、列数、非零元素个数
} TSMatrix;

2. 十字链表

typedef struct OLNode {
    int i, j;
    ElemType val;
    struct OLNode *right, *down;  // 行链、列链
} OLNode, *OLink;

typedef struct {
    OLink *rhead, *chead;  // 行头、列头指针数组
    int mu, nu, tu;
} CrossList;

手算示例

例 1:对称矩阵地址计算

4 阶对称矩阵,按行优先存下三角,起始地址 100,每元素 2 字节。求 $ a_{32} $:$ i=3,j=2 $,$ i\ge j $,下三角,

$ k = \frac{3\times2}{2} + 2 - 1 = 3 + 1 = 4 $,$ LOC = 100 + 4\times2 = 108 $。

求 $ a_{23} $:$ i<j $,利用对称 $ a_{23}=a_{32} $,$ k=4 $,$ LOC=108 $。

例 2:三对角矩阵

5 阶三对角,$ a_{34} $:$ i=3,j=4,|3-4|=1\le1 $,$ k = 2\times3 + 4 - 3 = 7 $。

例 3:三元组表示

下标ijval
0133
1224
2315
3446

常见考法

高频设问
  • 对称矩阵下标:$ k = \frac{\max(i,j)(\max(i,j)-1)}{2} + \min(i,j) - 1 $。
  • 三对角下标:$ k = 2i + j - 3 $($ |i-j|\le 1 $)。
  • 节省空间:对称矩阵省 $ n^2 - n(n+1)/2 = n(n-1)/2 $。
  • 三元组转置:时间复杂度 $ O(nu\times tu) $ 或快速转置 $ O(nu+tu) $。

易错点

必记
  1. 下标起点:公式 i,j 从 1 开始,k 从 0 开始。
  2. 对称矩阵公式:行列号大的做"行"。
  3. 三对角范围:$ |i-j| > 1 $ 时元素为 0。
  4. 三角矩阵常数:存在最后一个位置。
  5. 稀疏矩阵三元组:按行优先排序。

核心结论

矩阵类型压缩后元素数节省空间
对称矩阵n(n+1)/2n(n-1)/2
三角矩阵n(n+1)/2+1n(n-1)/2−1
三对角矩阵3n−2n²−3n+2

记忆卡片

对称矩阵压缩后元素个数?
n(n+1)/2。
对称矩阵 $a_{ij}$ 的下标公式?
$ k = \max(i,j)(\max(i,j)-1)/2 + \min(i,j) - 1 $。
三对角矩阵非零元素个数?
3n−2。
三对角 $a_{ij}$ 下标公式?
$ k = 2i + j - 3 $(|i−j| ≤ 1)。
稀疏矩阵常用存储方式?
三元组表(顺序)或十字链表(链式)。
三角矩阵常数存哪?
下/上三角常数统一映射到最后一个位置。

交互动画 · 对称矩阵映射

5 阶对称矩阵(橙=存储的下三角) 一维数组(k 从 0)
点击矩阵中任一单元格,查看其压缩后的一维下标 k
n = 5,只存下三角共 15 个元素
利用 $ a_{ij}=a_{ji} $,上三角元素会自动映射到对应下三角的 k。

相关知识点

stack-basic-operations stack-and-queue-applications

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。