矩阵的压缩存储
数组的存储结构
一维数组的存储结构
各个数组元素大小相同,且物理上连续存放
LOC:数组的起始地址
数组元素a[i]的存放地址 = LOC + i * sizeof(Elem Type)
二维数组的存储结构
行优先存储
b[i][j]的存储地址=LOC + (i*N + j) * sizeof(ElemType)
列优先存储
b[i][j]的存储地址 = LOC + (j*M+i) * sizeof(ElemType)
矩阵
普通矩阵的存储
可以用二维数组存储
特殊矩阵
对称矩阵
若n阶方程中任意一个元素a都有aij=aji则称该矩阵为对称矩阵
普通存储:二维数组
压缩存储:使用一维数组只存储主对角线+下三角区(或者主对角线+上三角区)
- 只存储主对角线+下三角区(i>=j):
按行优先原则将各个元素存入一维数组中
-
需要存储(1+n)*n/2个元素
-
可以实现一个“映射”函数:矩阵下标->一维数组下标
-
aij是第 i(i-1)/2+j个元素,即数组下标k=i(i-1)/2+j-1
-
只存储主对角线+上三角区(i<j):
-
aji是第 j(j-1)/2+i个元素,即数组下标k= j(j-1)/2+i-1
三角矩阵
除了上三角或者下三角区和对角线区,其余元素都相同为c
压缩存储策略:按行优先原则将橙色区元素存入一维数组中,并在最后一个位置存储常量c
下三角矩阵:
按行优先原则将各个元素存入一维数组中
- 需要存储(1+n)*n/2个元素(多出一个用于存储常量c)
- 下三角区和对角线元素数组下标 k=i(i-1)/2+(j-1) (i>=j);上三角区元素 k=n(n+1)/2
上三角矩阵:
按行优先原则将各个元素存入一维数组中 k=(i-1)(2n-i+2)/2+(j-i) (i<=j);k=n(n+1)/2 (i>j)
三对角矩阵
三对角矩阵,又称带状矩阵:当[i-j]>1时,有aij = 0 (1<=i,j<=n)
矩阵下标->一维数组下标
- 前i-1行共3(i-1)-1个元素
- aij是i行第j-i+2个元素
- aij是第2i+j-2个元素
- k=2i+j-3
数组下标k->矩阵下标
- 前i-1行共3(i-1)-1个元素
- 前i行共3i-1个元素
- 显然 3(i-1)-1<k+1<=3i-1
- i=[(k+2)/3] ([]为向上取整);
- 由 k=2i+j+3得出 j=k-2i+3
稀疏矩阵
非零元素远远小于矩阵元素的个数
压缩矩阵策略:
一 、顺序存储——三元组<行,列,值>
二、 链式存储——十字链表法