数构(C语言)——第四章、矩阵的压缩存储(下)

本文详细介绍了矩阵的压缩存储方法,包括一维数组、二维数组的不同存储方式,以及对称矩阵、下三角矩阵、上三角矩阵、三对角矩阵和稀疏矩阵的压缩存储技巧。重点讲解了如何通过行优先或列优先策略节约存储空间,并提到了稀疏矩阵的顺序存储和链式存储方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、矩阵的压缩存储

(一)、数组的存储结构

1、一维数组

(1)、定义:

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)

(二)、特殊矩阵

在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素,或者是零元素。有时为了节省存储空间,可以对这类矩阵进行压缩存储。
压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。其目的是为了节省存储空间。
假若值相同的元素或者零元素在矩阵中是分布有一定规律,则我们称此类矩阵为特殊矩阵

1、对称矩阵

若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二维数组
压缩存储策略

(1)、下三角矩阵:

只存储主对角线(i=j)+下三角区(i>j)
在这里插入图片描述
若i>=j,下三角元素A[i][j]在数组中的存放位置为(i-1)*i/2+j-1

(2)、上三角矩阵:

只存储主对角线(i=j)+上三角区(i<j)
在这里插入图片描述
若i<j,上三角元素A[i][j]在数组中的存放位置为(j-1)*j/2+i-1

2、三角矩阵

与对称矩阵类似,不同的是存储完上(下)三角区和主对角线上的元素,还要存储对角线另一方的元素一次。
将这个上(下)三角矩阵A[1…n][1…n]压缩存储在B[n(n+1)/2+1]中。
在这里插入图片描述

压缩存储策略:按行优先/列优先原则将下(上)三角区元素存入一维数组中,并在最后一个位置存储常量c

(1)、下三角矩阵:除了主对角线和下三角区,其余的元素都相同

下三角矩阵中任一元素在一个数组中的下标 k 与 i、j 的对应关系为:
1、i>=j:(i-1)i/2+j-1;
2、i<j:n
(n+1)/2

(2)、上三角矩阵:除了主对角线和上三角区,其余的元素都相同

上三角矩阵中任一元素在一个数组中的下标 k 与 i、j 的对应关系为:
1、i>=j:(i-1)(2n-i+2)/2+(j-i);
2、i<j:n
(n+1)/2

3、三对角矩阵(又称带状矩阵)

三对角矩阵中除主对角线及主对角线上下最相邻的两条对角线上的元素外,所有元素均为0。
在这里插入图片描述

总共有3n-2个非零元素当|i-j|>1时,有 a i , j a_{i,j} ai,j=0
压缩存储:按行优先(或列优先)原则,只存储带状部分

4、稀疏矩阵

非零元素个数远远少于矩阵元素的个数且分布无规律可循。
在这里插入图片描述

压缩存储策略:只存储非零元素

(1)、顺序存储:

三元组<行,列,值>
将非零元素及其行和列构成一个三元组(行标、列标、值)。稀疏矩阵压缩存储后就失去了随机存取的特性

//三元组的定义
struct element
{
	int row,col;
	ElemType item;
}
(2)、链式存储:

十字链表法
向右域right:指向同行的下一个元素
向下域down:指向同列的下一个元素

评论 50
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双非本算法牛马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值