章节标题虽然是数组与矩阵,但重点完全偏向于矩阵的存储结构。有关数组的部分也都是为存储矩阵做基础铺垫。
另外,与以前章节更注重时间复杂度不同,本章更注重存储矩阵所占空间的优化。 所以之后对比的时候会加入对空间的利用效率。
矩阵的存储结构分为四种:
- 数组的数组(最普遍的做法)
- 一维数组(重点部分,包括一般矩阵的存储和特殊矩阵的压缩存储)
- 单个线性表(侧重于稀疏矩阵)
- 多个线性表(侧重于稀疏矩阵)
本文中的矩阵均默认为二维矩阵,m = 矩阵行数, n = 矩阵列数。
数组的数组:
所占空间: m * n * sizeof(element) + 指针个数 * sizeof(指针类型);
空间要求: 分散的连续存储空间,连续存储空间大小取决于m和n。
一维数组:
数组的应用需要我们把元素序列化,即按一维顺序排列。 由此引出行主映射和列主映射。了解映射关系之后,便可把用一维数组存储的矩阵封装为矩阵类(Matrix class).
基本操作:
- 矩阵加法
- 矩阵乘法
- 矩阵转置
这是最基本的矩阵操作,无论用上面四种的哪一种进行保存矩阵,这些操作都是不可或缺的。
所占空间:m * n * sizeof(element)
空间要求:连续的、能够容纳m * n * sizeof(element)的存储空间。
特殊矩阵的压缩存储:
- 对角矩阵(diagonal)
- 三对角矩阵(tridiagonal)
- 下三角矩阵(lower triangular)
- 上三角矩阵(upper triangular)
- 对称矩阵(symmetric)
这些特殊的矩阵都为方阵(square matrix),且压缩思想除对称矩阵外都为不存储矩阵中的零元素,比如对角矩阵只需要存储对角线上的元素,便可描述整个矩阵,因为其余元素都为0.
对称矩阵的压缩思想为在矩阵中两个对称的相同值的元素共用一个存储空间,只需存储一半的元素。
单个线性表
线性表主要描述稀疏矩阵(spare matrix)
稀疏矩阵的定义:如果大多数矩阵为零,则称为稀疏矩阵。比如n*n矩阵,书中规定的元素个数为(n^2)/5 ~ (n^2)/3.上述特殊矩阵中,三角矩阵被视为特殊矩阵。
注意:特殊矩阵压缩后仍保留随机存取特性(仍为公式化描述),稀疏矩阵压缩后会失去随机存取特性(链式描述)
层次结构如下:
所占空间:
存储行数和列数的空间+每个非0元素需要存储的行、列和值空间+存储线性表元素个数和容量的空间+数组引用空间
空间要求:
因为保存结构体的线性表类型为公式化线性表,所以空间要求为连续空间
多个线性表
通常用于存储稀疏矩阵,与单个线性表存储稀疏矩阵的不同之处为把每一行的非0元素用一个线性表存储。因为每一行的非0元素的个数通常不同,使用公式化线性表会浪费空间,所以使用链式线性表来存储每一行的非0元素。
所占空间:
此时非0项的节点与每行链表的头结点结构不同
所占空间即为上述两种节点所占总空间
空间要求: 不要求为连续的空间