矩阵的压缩存储

本篇文章主要介绍的内容是矩阵的压缩存储,现在通过一张思维导图来了解下本文的大概内容。
在这里插入图片描述

数组

在说矩阵的压缩存储前,先说下数组,在C语言或者C++语言里面,已经知道什么是数组了,但是在数据结构里的数组和它们不一样。在编程语言里,它们是一种数据类型,其实数据结构是比编程语言要出现的早的,下面让我们来了解下几种数组。
1.一维数组A是n个相同类型数据元素构成的有限序列。
2.二维数组可看作是每个数据元素都是相同类型的一维数组的一维数组;这句话可能很奇怪,光从字面意思有点不太好理解,那么就有下图给大家看下,可能就会有所理解。

从这张图,可以比较好的理解这句话。由一个一位数组,并且每个里面又有一个一位数组。其实按照表格的话可以比较直观的看出来。
在这里插入图片描述
差不多就是这样。
那么三维数组也是差不多的,也就是本来二维是一个平面,那么三维就是立体的。
d维数组是一个由d-1维数组作为数据元素的线性表,是一种复杂的线性结构,因此数组是线性表的推广。
d维数组中,每个元素的位置由d个整数的d维下标来表示
通常将数组的所有元素存储到一块地址连续的内存单元,即数组特别适合采用顺序存储

一维数组

在这里插入图片描述
假设第一个的起始地址是LOC(a1),这里为什么 是a1呢,因为其实一般我们都习惯把1当做第一位,所以就先把他看成a1吧。那么假设一个元素占k个位置,其中k=sizeof(Element)。那么第二个的位置应该是LOC(a2)=LOC(a1)+(2-1)*k。所以第i个应该是LOC(ai)=LOC(a1)+(i-1)*k

二维数组

可以把二维数组看作一张表格。比如下图。
在这里插入图片描述
那么二维数组由两种存储方式,一种是行优先存储,一种是列优先存储。顾名思义,行优先就是按行来存储,比如上面那张图,就先存储a[0][0]和a[0][1]这两个。如果按列优先的话就会先存储a[0][0]和a[1][0]了。那么我们需要通过下图来算下按照行优先和按照列优先两种位置是如何计算的。假设由一个m*n的二维数组如下图。
在这里插入图片描述
注意,这里下标都是从1开始而不是从0,所以i和j每次计算的话都需要减1。
首先是行优先,那么是一行一行 的存储,如果我要知道第aij是如何得到的呢。那么只要计算在aij前面有多少元素然后再乘一个k就行了。在aij这一行前面是有j-1个元素。在它的上面则是有(i-1)*n个元素。所以这里得到的aij的位置是:

LOC(a i,j)=LOC(a 1,1)+[(i-1)*n+(j-1)]*k
列优先的话其实就是把i换成j,把n换成m就行了。公式如下。
LOC(a i,j)=LOC(a 1,1)+[(j-1)*m+(i-1)]*k

多维数组

在这里多维数组只以三维为例子,说实话感觉一般的地方用的不多,不过三维数组也比较好理解。比如有一个三维数组a[2][3][4]。那么它的图形则如下图。
在这里插入图片描述
可以把2理解为它的高,3则是宽,4则是长。这里对三维数组不多展开,本人暂时也没太多的接触,等到以后有接触之后再写文章以补充。

矩阵存储

我们知道一般的矩阵可以通过二维数组存储,比如下图。
在这里插入图片描述
那么特殊矩阵就可压缩空间进行存储,通过下图,可以来看下有哪些特殊矩阵。
在这里插入图片描述

对称矩阵的压缩存储

所谓对称矩阵就是类似于aij=aji这样的,如下图。
在这里插入图片描述
这样子,只需要存储一半就行了。那么如果按照图中,我们存储的是下三角区域,第一行需要存储1个,第二行需要存储2个,第n行则存n个,那么这是等差数列,所以对它进行求和,也就是1+2+…+n,那么得到n(n+1)/2。一开始如果是按行优先存储到一个一维数组里得到的是。
在这里插入图片描述
那么在压缩好的数组里面需要存储的是上面计算好的n(n+1)/2,由于数组下标是0开始的,所以最后一个下标是n(n+1)/2-1,压缩数组如下:
在这里插入图片描述
这时候,如何来找aij这个元素呢。比如a3,3,那么它应该是算上它前两行的在加上这一行前面的。前面两行应该是1+2,如果说i是第i行呢,那就应该是1+2+3+…+(i-1)是吧,所以按照等差数列求和公式来看,那就是(1+(i-1))*(i-1)/2,除了i上面的i-1行,还得计算i行的前j-1个元素,所以当i≥j的时候计算的公式应该是

(1+(i-1))*(i-1)/2+j-1
i如果是小于j的话,那么只需要把公式ij互换下就行了。公式如下:
(1+(j-1))*(j-1)/2+i-1

三角矩阵的压缩存储

三角矩阵相比对称矩阵的话,就是需要多存一个常数C,可以看下下面三角矩阵的图。
在这里插入图片描述
也就是本来需要存(n+1)*n/2个,现在需要加1,那么就是n(n+1)/2+1,其实数组下标就是从0开始的,那么最后一个元素其实就是(n+1)*n/2。同样先看行优先的。
在这里插入图片描述
按照图中的来存储到一个b矩阵,那么如何找它的位置,发现当i>j的时候是C,所以最后一个位置是C,那么就是下标n*(n+1)/2。当i≤j的时候如何计算,同样需要计算上面有多少行,这里跟之前不一样,这里是一个从大到小的等差数列。就不演示如何计算了,最后得到的是(1+(i-1))*(i-1)/2+j-i

对角矩阵的压缩存储

对角矩阵:方阵A满足所有非零元素都集中在以主对角线为中心的带状区域中,则称为n阶对角阵。
主对角线上、下方各有1条非0元素构成的次对角线,为三对角矩阵。
可能语言说起来不是特别明白,看一张图就知道了。
在这里插入图片描述
老规矩,看下行优先存储。
在这里插入图片描述
那么来算一下它有多少个元素,给第一行和最后一行都补一个,如图。那么一共就有3n个,要减去补上的2个,那就是3n-2个,所以最后的压缩的数组就是如下图,因为下标0开始,所以最后元素下标是3n-3。
在这里插入图片描述
这里的位置的公式是2i+j-3

稀疏矩阵的压缩存储

稀疏矩阵:当一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t非常小时,则为稀疏矩阵。(元素分布没有规律的)
就拿下图来说吧。
在这里插入图片描述
这里可以用三元组表示法,来看下下面这张表格

i(行)j(列)aij(值)
131
221
323
三元组法比较好理解,就不多说了。还有一种就是十字链表法,来换个4*4的矩阵,如下图。
在这里插入图片描述
下面就是这个矩阵的十字链表法
在这里插入图片描述
可以看出,第一列和第四行都是0,所以用NULL表示,那么蓝色的就是指向列的下一个,橙色的就是指向行的下一个。也是比较容易懂的。

总结

矩阵的压缩存储来说,内容不是特别的复杂,只要能计算出位置就行,一般无论是用到考试或者应用中都没什么问题。如果对文中有哪里有疑问的欢迎提出。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值