数组和特殊矩阵
数组的存储结构
按行优先
数组元素在内存中按行的顺序依次存储。
二维数组示例:
设 ,存储顺序:
地址计算推导: 元素 前有 行(每行 个元素)和当前行的 个元素,故偏移量 。 公式:
按列优先
数组元素在内存中按列的顺序依次存储。
二维数组示例:
的存储顺序:
地址计算推导: 元素 前有 列(每列 个元素)和当前列的 个元素,故偏移量 。 公式:
特殊矩阵的压缩存储
对称矩阵
满足 ,仅需存储下三角(含主对角线)。
示例:
压缩存储序列:
地址映射推导:
- (下三角):元素 前有 行(第 到 行),元素总数 ,加上当前行 个元素。 公式:
三角矩阵
下三角矩阵
示例: 压缩存储序列:
地址映射:
- 时:
- 时:(指向常数 )
上三角矩阵
地址映射推导: 元素 前有 行(第 到 行),每行元素数递减: 第 行: 个,第 行: 个,…,第 行: 个。 前 行总元素数:,加上当前行偏移 。 公式:
三对角矩阵(带状矩阵)
非零元素位于主对角线及其相邻两条对角线上,满足 。
示例:
压缩存储序列:
地址映射推导:
- 每行最多 个非零元素(首末行 个)。
- 元素 在序列中的位置:前 行有 个元素(),加上当前行偏移 。 公式:
稀疏矩阵
非零元素远少于零元素,通常采用压缩存储。
三元组表示法
用三元组 表示非零元素的位置和值。
示例:
的三元组: 和 。
存储结构:
typedef struct {
int i, j; // 行标和列标
ElemType v; // 元素值
} Triple;记忆技巧:
- 行优先排序:先按行号排序,同行内按列号排序(类似字典序)。
- 压缩原理:用 空间存储 个非零元素(传统矩阵需 )。
十字链表表示法
适用于需要频繁插入和删除操作的稀疏矩阵,每个非零元素用一个节点表示,同时链接在对应的行链表和列链表中。
除了三元组(行标、列标、值)还要保存行数、列数和非零元素的个数。