数据结构(22)特殊矩阵的压缩存储

本文探讨了特殊矩阵(如对称矩阵、三角矩阵、三对角矩阵、稀疏矩阵)的压缩存储方法,旨在减少存储空间的浪费。通过分析矩阵元素的分布规律,提出了一种有效的压缩存储方案。

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

目录

1、对称矩阵

2、三角矩阵

3、三对角矩阵

4、稀疏矩阵


矩阵在计算机图形学、工程计算中占有举足轻重的地位。在数据结构中考虑的是如何用最小的内存空间来存储同样的一组数据。所以,我们不研究矩阵及其运算等,而把精力放在如何将矩阵更有效地存储在内存中,并能方便地提取矩阵中的元素。

压缩矩阵:指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。其目的是为了节省存储空间。

特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。常见的特殊矩阵有对称矩阵、上(下)三角矩阵、对角矩阵等。

特殊矩阵的压缩存储方法:找出特殊矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布的、值相同的多个矩阵元素压缩到一个存储空间中。

1、对称矩阵

若对一个n阶方阵A[1...n][1...n]中的任意一个元素aij = aji(1<=i,j<=n),则称其为对称矩阵。对于一个n阶方阵,其中的元素可以划分为3个部分,即上三角区,主对角线和下三角区,如图22.1所示。

                                                    图22.1  对称矩阵

对于n阶对称矩阵,上三角区的所有元素和下三角区的对应元素相同,若仍采用二维数组存放,则会浪费几乎一半的空间,为此将对称矩阵A[1...n][1...n]存放在一维数组B[n(n+1)/2]中,即元素aij存放在bk中,只存放下三角部分(包含主对角)的元素。

在数组B中,位于元素ai,j(i>=j)前面的元素个数为

第1行:1个元素(a1,1)。

第2行:2个元素(a2,1,a2,2)。

......

第i-1行:i-1个元素(ai-1,1,ai-1,2,...,ai-1,i-1)。

第i行:j-1个元素(ai,1,ai,2,...,ai,j-1)

因此,元素ai,j在数组B中的下标k=1+2+...+(i-1)+j-1=i(i-1)/2+j-1(数组下标从0开始)。因此,元素下标之间的对应关系如下:

2、三角矩阵

                                              图22.2  三角矩阵

下三角矩阵中,上三角区的所有元素均为一常量。其存储思想与对称矩阵类似,不同之处在于存储玩下三角和主对角线上的元素之后,紧接着存储对角线上方的常量一次,故可以将下三角矩阵A[1...n][1...n]压缩存储在一维数组B[n(n+1)/2+1]中。

元素下标之间的对称关系为

下三角矩阵在内存中的压缩存储形式如下所示。

上三角矩阵[见图22.2(b)]中,下三角区的所有元素均为同一常量。只需存储主对角、上三角区上的元素和下三角区的常量一次,可将其压缩到存储到B[n(n+1)/2+1]中。

在数组B中,位于元素ai,j(i<=j)前面的元素个数为

第1行:n个元素

第2行:n-1个元素

......

第i-1行:n-(i-2) = n-i+2个元素

第i行:j-i个元素

因此,元素ai,j在数组B中的下标k=n+(n-1)+...+(n-i+2)+(j-i)=(i-1)(2n-i+2)/2+(j-i)。

因此,元素下标之间的对应关系如下:

上三角矩阵在内存中的压缩存储如下所示:

3、三对角矩阵

对角矩阵也称带状矩阵,对于n阶方阵A中的任一元素ai,j,当|i - j|>1时,有ai,j = 0(1<=i,j<=n),则称为三对角矩阵,如图所示

                                   图22.3  三对角矩阵

在三对角矩阵中,所有非零元素都集中在以主对角线为中心的3条对角线的区域,其余区域的元素都为零。

三对角矩阵A也可以采用压缩存储,将三条对角线上的元素按行优先方式存放在一维数组B中,且a1,1存放在B[0]中。

由此可以计算出矩阵A中3条对角线上的元素ai,j(1<=i,j<=n,|i-j|<=1)在一维数组B中存放的下标为k=2i+j-3。

4、稀疏矩阵

矩阵中非零元素的个数t,相对矩阵元素的个数s来说非常少,即s>>t的矩阵称为稀疏矩阵。

例如,一个矩阵的阶为100*100,该矩阵中只有少于100个非零元素。

若采用常规的方法存储稀疏矩阵,则相当浪费存储空间,因此仅存储非零元素。但通常零元素的分布没有规律,所以仅存储非零元素的值是不够的,还要存储它所在的行和列。因此,将非零元素及其相应的行和列构成一个三元组(行标,列标,值),如下图所示。然后再按照某种规律村粗这些三元组。稀疏矩阵压缩存储后便失去了随机存取特性。

                                                                  图22.4  稀疏矩阵及其对应的三元组

洗漱矩阵的三元组出来上面说的数组存储,也可以使用十字链表法存储。

各个结点的数据结构如下:

十字链表的节点结构

指针域A指向列的下一个元素,指针域B指向行的下一个元素。

所以十字链表法存储如下:

可以看到,使用十字链表压缩存储稀疏矩阵时,矩阵中的各行各列都各用一各链表存储,与此同时,所有行链表的表头存储到一个数组(rhead),所有列链表的表头存储到另一个数组(chead)中。

如果你仔细看,会发现就是将稀疏矩阵原本的存储数组里的单元改为结点,然后为空的地方不分配内存,以此达到节省存储空间的目的。

 

 

 

人,总是要有一点精神的,不是吗

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值