特殊矩阵的压缩存储


/*
* 压缩存储:把矩阵中值相同的在物理上只存储一次,0不存储
* 实现原理:将非线性的矩阵转为线性(按行优先和按列优先两种存储方式)存在内存中
* 逻辑结构是:矩阵(是非线性的,因为他的数据下标是不连续的)
* 物理结构是:顺序结构(一维数组)
* 所以想要在逻辑结构上访问物理结构上存储的数据,要建立从逻辑结构到物理结构的映射函数
* 就是建立矩阵中的行号和列号,与一维数组中下标的映射函数
* 建立方法:按行优先和按列优先两种办法
* --因为是把矩阵中的元素放进一维数组(相当于把矩阵中元素按一定顺序放入一维数组中),所以,我们要找的关系是原来
* 矩阵中的元素位置和矩阵中元素存储的线性位置是有函数关系的,我们通过这个关系,在逻辑上操作物理结构,"仿佛"物理上存储的就是原本的矩阵
* 建立过程:
* 1.先看矩阵是否为1,1下标开始的(默认是1,1),aij(i,j列元素)
* 2.确定物理存储方式是按行优先还是按列优先 还要确定数组下标是否从0开始,默认0开始
* 3.通过物理存储方式和i,j,建立aij元素在矩阵中的(线性位置函数)
* 确定方法:以按行优先存储和n*n对称矩阵为例 对称矩阵只存储对角线和下三角区的元素
* 找到矩阵中aij元素前面有多少个元素就可以确定aij的位置了
* aij在矩阵中的线性位置=先找前i-1行有多少元素+iaij前面的元素
* 1=<i<=n,1=<j<=n
* 1 : 1 (每行要存储的元素个数)
* 2 : 2
* 3 : 3
* . .
* . .
* . .
* i-1 : i-1
* i : j 因为j1开始,所以,当前位置为j
* aij在对称矩阵中的线性位置为: (i-1)*i/2+j
* (注意第一个元素是1位置,此时要看一维数组中元素的位置是0还是1,
* 0的话 (i-1)*i/2+j-1aij在一维数组中的位置下标,
* 1的话 (i-1)*i/2+jaij在一维数组中的位置下标)
* 设一维数组下标为K(0-n(n+1)/2-1) 一共保存 1+2+3...+n=n(n+1)/2个元素到一维数组中
* 元素aij在一维数组中的位置为(因为一维数组默认从0开始,
* 所以矩阵中元素线性位置要-1(因为)):K=1+2+3...+i-1+j-1=(i-1)*i/2+j-1
* 注意:物理存储方法和特殊矩阵的压缩存储方式都影响,逻辑和物理结构上映射函数的建立
posted @ 2021-03-12 22:30  nanfengnan  阅读(130)  评论(0编辑  收藏  举报