学习数据结构--第三章:栈和队列(特殊矩阵的压缩存储)

学习数据结构--第三章:栈和队列(特殊矩阵的压缩存储)

Scroll Down

特殊矩阵的压缩存储

1.矩阵

在C语言中,我们通常使用二维数组来存储矩阵。

2.矩阵的压缩存储

比如我们要将下面的学生信息通过一个3行6列的矩阵存储起来,但是所有的学生的信息都是一样的,所以我们其实只用存储一个就行了。

下面的信息,每一行信息都是一样的,按照上述压缩方式我们只需三个存储单元就可以存放该矩阵的所有信息了。

  • 压缩存储:指多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。
  • 特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。
  • 特殊矩阵的压缩存储:找出特殊矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布、值相同的多个矩阵元素压缩存储到一个存储空间上。

只有特殊矩阵才能压缩存储。

3.特殊矩阵的压缩存储

3.1对称矩阵

对称矩阵: 若对一个n阶方阵A[1...n][1....n][中的任意元素aij都有aij=aji(1 ≤ i, j ≤ n),则称其为对称矩阵。

如下图:

在矩阵中我们常把矩阵化成三个区域:

  • i > j 下三角区域
  • i = j 主对角线
  • i < j 上三角区域

根据此矩阵的特点我们发现,我们只需存储:下三角区域主对角线区域;原先我们的数组为A[n][n] ,现在我们只需要B[n(n+1)/2]个存储单元就行了,这就达到压缩的目的了。

这个 n(n+1)/2 是通过等差数列求和得到的,第一行一个元素,第二行两个元素,第三行三个元素.....

具体存放顺序:

现在思考:压缩存储的数组中aij的下标为?

答案:k=[i(i-1)/2] + j-1

分析:第 i j 个元素的前 i-1 行元素的总个数为:1,2,3,4,5....i-1 个,等差数列求和:i(i-1)/2个,另外,第i行我们有j个元素,故再加上j,最后我们求得是下标,所以减去一个1,故答案:k=[i(i-1)/2] + j-1

注意我们假设这里的B数组下标从0开始

3.2三角矩阵

三角矩阵: 若对一个n阶方阵A[1...n][1...n] 上(下)三角区元素均为同一常量,则称为(上)三角矩阵。

压缩存储的数组B[[n/(n+1)/2]+1] ,这里的n(n+1)/2和上面的对称矩阵是一样,至于这个+1是因为,我们要将这个相同的常量C存放在该数组B的最后一个存储单元上。

下三角矩阵

按行优先存储

上三角矩阵

按行优先存储

注意我们假设这里的B数组下标从0开始

3.3三对角矩阵

三对角矩阵 若对一个n阶方阵A中的任意元素aij,当|i-j|>1,有aij=0(1<=i,j<=n),则称为三对角矩阵。

其实就是除了主对角线的元素和两侧的元素之外,其他元素的值都等于0,就称为 三对角矩阵

三对角矩阵压缩存储依然按行优先存储

现在思考:压缩存储的数组中aij的下标为?

注意我们假设这里的B数组下标从0开始

答案:k=3(i-1)-1+ j-(i-1)+1 -1 = 2i+j-3

若已知 k,求 i,j?

答案:

  • i=[(k+1)/3+1]
  • j= k-2i+3

解释:k+1 表示数组下标从0开始,我们求得是i,所以要加1, 然后除以三,代表有多少个元素为三个的整行,然后我们知道第一行元素只有两个,然后我们从第i行中拿一个补到第一行当中,那么在第i行中元素个数永远不会为3个了,所以加1然后去下界,就得到了行号。

注意:这里的 [ ] 不再代表括号,而是代表求整函数,例如:[4/3] = 1,[8/3]=2

3.4稀疏矩阵

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

这里说的非常多是一个模糊的概念。下面使用 三元组存储。

我们使用三元组来压缩存储稀疏矩阵,稀疏矩阵压缩存储后失去了随机存储的特性。

4.特殊矩阵数组

数组 是由n(n>=1)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素受n个线性关系的约束,每个元素在n个线性关系中的序号称为该元素的下标,并称该数组为n维数组。

数组是线性表的推广!

4.1数组的维度

数组是具有维度的

4.2数组的维度和维界不可变

数组一旦被定义,其维度和维不可变,数组除初始化和销毁外,只有存取元素和修改元素的操作

4.3数组的存储结构

采用顺序存储,是一个块连续的存储空间。

二维数组存储顺序
按行优先
在这里插入图片描述

LOC(a00)代表第一个元素的地址,然后L是每个元素的大小,(n+1)代表每一行从0nn+1一个元素,i*(n+1)*L中的i是因为第 i 行,从0-到 i-1i 行,所以乘以 i ,后面加上 j*:L是因为第aij,代表第i+1行的第j个元素,所以加上这些元素的地。

按列优先

LOC(a00)代表第一个元素的地址,按列优先,首先要加上前0----(j-1)列的的地址空间:j*(n+1)*L ,然后加上第j列此元素上面的空间,总共0----(i-1)个元素即为i个,故:i*L

关于数据结构的知识,持续更新中,欢迎关注公众号理木客