一、矩阵的压缩存储 (一)、数组的存储结构 1、一维数组 (1)、定义:个性签名:整个建筑最重要的是地基,地基不稳,地动山摇。而学技术更要扎稳基础,关注我,带你稳扎每一板块邻域的基础。
博客主页:啊四战斗霸的博客
专栏:数据结构(C语言版)
创作不易,走过路过别忘了三连击了哟!!!
关注作者,不仅幸运爆棚,未来更可期!!!
有代码,就有注释
Triple attack(三连击):Attention,Like and Collect.
ElemType a[MaxSize]; //ElemType型一维数组
各数组元素大小相同,且物理上连续存放
int main()
{
int a[10]={0};
int i=0;
for(i=0;i<10;i++)
a[i]=i;
return 0;
}
数组元素a[i]的存放地址=起始地址+i*sizeof(ElemType)
2、二维数组 (1)、定义:ElemType b[M][N]; //M行N列的二维数组
(2)、存储方式:行优先存储或列优先存储。M行N列的二维数组b[M][N]中,
若按行优先存储,则b[i][j]的存储地址=起始地址+(iN+j)sizeof(ElemType)
若按列优先存储,则b[i][j]的存储地址=起始地址+(jM+i)sizeof(ElemType)
在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素,或者是零元素。有时为了节省存储空间,可以对这类矩阵进行压缩存储。
压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。其目的是为了节省存储空间。
假若值相同的元素或者零元素在矩阵中是分布有一定规律,则我们称此类矩阵为特殊矩阵
若n阶方阵中任意一个元素
a
i
,
j
a_{i,j}
ai,j都有
a
i
,
j
a_{i,j}
ai,j=
a
j
,
i
a_{j,i}
aj,i则该矩阵为对称矩阵
将对称矩阵A[1…n][1…n]存放在一维数组B[n(n+1)/2]中,B数值下标从0开始
普通存储:n*n二维数组
压缩存储策略:
只存储主对角线(i=j)+下三角区(i>j)
若i>=j,下三角元素A[i][j]在数组中的存放位置为(i-1)*i/2+j-1
只存储主对角线(i=j)+上三角区(i 与对称矩阵类似,不同的是存储完上(下)三角区和主对角线上的元素,还要存储对角线另一方的元素一次。 压缩存储策略:按行优先/列优先原则将下(上)三角区元素存入一维数组中,并在最后一个位置存储常量c 下三角矩阵中任一元素在一个数组中的下标 k 与 i、j 的对应关系为: 上三角矩阵中任一元素在一个数组中的下标 k 与 i、j 的对应关系为: 三对角矩阵中除主对角线及主对角线上下最相邻的两条对角线上的元素外,所有元素均为0。 总共有3n-2个非零元素。当|i-j|>1时,有
a
i
,
j
a_{i,j}
ai,j=0 非零元素个数远远少于矩阵元素的个数且分布无规律可循。 压缩存储策略:只存储非零元素 三元组<行,列,值> 十字链表法
若i
将这个上(下)三角矩阵A[1…n][1…n]压缩存储在B[n(n+1)/2+1]中。
1、i>=j:(i-1)i/2+j-1;
2、i
1、i>=j:(i-1)(2n-i+2)/2+(j-i);
2、i
压缩存储:按行优先(或列优先)原则,只存储带状部分
将非零元素及其行和列构成一个三元组(行标、列标、值)。稀疏矩阵压缩存储后就失去了随机存取的特性//三元组的定义
struct element
{
int row,col;
ElemType item;
}
(2)、链式存储:
向右域right:指向同行的下一个元素
向下域down:指向同列的下一个元素



