数据结构与算法之矩阵的压缩存储

数组的存储结构

一维数组的存储结构

image.png

  1. 各数组元素大小相同,且物理上连续存放。
  2. 数组元素 a[i] 的存放地址=LOC+i*sizeof(ElemType)
  3. 除非题目特别说明,否则数组下标默认从 0 开始

二维数组的存储结构

image.png

M 行 N 列的二维数组 b[M][N] 中,若按照行优先存储,则 b[i][j] 的存储地址=LOC+(i*N+j)*sizeof(ElemType)

普通矩阵的存储

可用二维数组存储

image.png

注意:描述矩阵元素时,行、列号通常从 1 开始;而描述数组时通常下标从 0 开始(具体看题目给出的条件,注意审题!)

特殊矩阵

分类:

  1. 稀疏矩阵

  2. 方阵:

    1. 对称矩阵
    2. 三角矩阵
    3. 三对角矩阵

某些特殊矩阵可以压缩存储空间

对称矩阵

定义:若 n 阶方阵中任意一个元素 a[i][j]=a[j][i],则该矩阵称为对称矩阵

普通存储:n*n 二维数组

压缩存储策略:只存储主对角线 [i=j]+ 下三角区 [i<j]

image.png

以 该策略 为例,按行优先原则将各元素存入一维数组中。

image.png

问题:

  1. 数组大小应该设为多少?
  2. 站在程序员的角度,对称矩阵压缩存储后怎样才能方便使用?

解答:

  1. 数组大小应该设为多少?
length:n,数组下标默认0开始:
01个数据
12个数据
23个数据
....
n-1:n个数据
//以上规律不就是数学的等差数列的前n项和吗

等差数列公式: ^7kygmb

image.png

  1. 站在程序员的角度,对称矩阵压缩存储后怎样才能方便使用?

可以实现一个“映射”函数:矩阵下标➡一维数组下标,看下列步骤

  1. 按行优先:按行[就是横着走]优先的原则,a[i][j] 是第几个元素?

    思路分析:首先 a[i][j] 是在第 i 行第 j 列,而 i 行前面有 i-1 行,i-1 行就有 (1+2+3+...+i−1) 个元素,而在元素所在行中元素前有 j 个元素,总的元素就是等于:如下图

    image.png

    image.png

    j-1 是为了下标从零开始计算

    a[i][j]==a[j][i]

  2. 按列优先:按列[就是竖着走]优先的原则,a[i][j] 是第几个元素?

    思路分析:首先 a[i][j]是在第i行第j列,而第j列前有第j-1列,第1列有n个元素,且往后排,列的元素个数依次递减,为(n+n-1+n-2+...+2+1)个,i行前面(垂直方向)有i-j个元素,总的元素就是:【与上面的[公式](3.12 矩阵的压缩存储) 进行联想】

    image.png

三角矩阵

  1. 下三角矩阵:除了对角线和下三角区,其余的元素都相同
  2. 上三角矩阵:除了对角线和上三角区,其余的元素都相同

image.png

下三角矩阵

image.png

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

image.png

上三角矩阵

image.png

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

image.png

三对角矩阵的压缩存储

image.png

  1. 三对角矩阵,又称带状矩阵

  2. 当|i-j|绝对值>1 时,有 a[i][j]=0(1<i,j≥n)

  3. 压缩存储策略:按行优先 (或列优先) 原则,只存储带状部分

按行优先

image.png

存储空间大小计算:除开头行和末尾行,其余行均有三个元素,元素个数为: 3 n − 2 3n-2 3n2

image.png

根据下标求位置

image.png

image.png

稀疏矩阵的压缩存储

稀疏矩阵:非零元素远远少于矩阵元素的个数,,如下图

image.png

压缩存储策略:

  1. 顺序存储 – 三元组<行,列,值>

    image.png

  2. 链式存储 – 十字链表法

    image.png

总结

image.png

常见考点

image.png

  • 11
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

five-five

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

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

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

打赏作者

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

抵扣说明:

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

余额充值