数据结构与算法之矩阵的压缩存储
数组的存储结构
一维数组的存储结构
- 各数组元素大小相同,且物理上连续存放。
- 数组元素 a[i] 的存放地址=LOC+i*sizeof(ElemType)
- 除非题目特别说明,否则数组下标默认从 0 开始
二维数组的存储结构
M 行 N 列的二维数组 b[M][N] 中,若按照行优先存储,则 b[i][j]
的存储地址=LOC+(i*N+j)*sizeof(ElemType)
普通矩阵的存储
可用二维数组存储
注意:描述矩阵元素时,行、列号通常从 1 开始;而描述数组时通常下标从 0 开始(具体看题目给出的条件,注意审题!)
特殊矩阵
分类:
-
稀疏矩阵
-
方阵:
- 对称矩阵
- 三角矩阵
- 三对角矩阵
某些特殊矩阵可以压缩存储空间
对称矩阵
定义:若 n 阶方阵中任意一个元素 a[i][j]=a[j][i],则该矩阵称为对称矩阵
普通存储:n*n 二维数组
压缩存储策略:只存储主对角线 [i=j]
+ 下三角区 [i<j]
以 该策略 为例,按行优先原则将各元素存入一维数组中。
问题:
- 数组大小应该设为多少?
- 站在程序员的角度,对称矩阵压缩存储后怎样才能方便使用?
解答:
- 数组大小应该设为多少?
length:n,数组下标默认0开始:
0:1个数据
1:2个数据
2:3个数据
....
n-1:n个数据
//以上规律不就是数学的等差数列的前n项和吗
等差数列公式: ^7kygmb
- 站在程序员的角度,对称矩阵压缩存储后怎样才能方便使用?
可以实现一个“映射”函数:矩阵下标➡一维数组下标,看下列步骤
-
按行优先:按行[就是横着走]优先的原则,
a[i][j]
是第几个元素?思路分析:首先
a[i][j]
是在第i
行第j
列,而i
行前面有i-1
行,i-1
行就有(1+2+3+...+i−1)
个元素,而在元素所在行中元素前有j
个元素,总的元素就是等于:如下图j-1
是为了下标从零开始计算a[i][j]==a[j][i]
-
按列优先:按列[就是竖着走]优先的原则,
a[i][j]
是第几个元素?思路分析:首先
a[i][j]
是在第i
行第j
列,而第j
列前有第j-1
列,第1
列有n
个元素,且往后排,列的元素个数依次递减,为(n+n-1+n-2+...+2+1)
个,i
行前面(垂直方向)有i-j
个元素,总的元素就是:【与上面的[公式](3.12 矩阵的压缩存储) 进行联想】
三角矩阵
- 下三角矩阵:除了对角线和下三角区,其余的元素都相同
- 上三角矩阵:除了对角线和上三角区,其余的元素都相同
下三角矩阵
压缩存储策略(下三角矩阵):按行优先原则将橙色区元素存入一维数组中。并在最后一个位置存储常量c
上三角矩阵
压缩存储策略 (上三角矩阵):按行优先原则将绿色区元素存入一维数组中。并在最后一个位置存储常量 c
三对角矩阵的压缩存储
-
三对角矩阵,又称带状矩阵
-
当|i-j|绝对值>1 时,有 a[i][j]=0(1<i,j≥n)
-
压缩存储策略:按行优先 (或列优先) 原则,只存储带状部分
按行优先
存储空间大小计算:除开头行和末尾行,其余行均有三个元素,元素个数为: 3 n − 2 3n-2 3n−2
根据下标求位置
稀疏矩阵的压缩存储
稀疏矩阵:非零元素远远少于矩阵元素的个数,,如下图
压缩存储策略:
-
顺序存储 – 三元组<行,列,值>
-
链式存储 – 十字链表法