数据结构 矩阵的压缩存储

5、矩阵的压缩存储

5.1、对称矩阵的压缩存储

若n阶矩阵任意一个元素,都有的ai,j=aj,i的矩阵称为对称矩阵,

普通存储:二位数组存储需要n*n个位置

压缩存储策略:值存储对角线和下三角(或者对角线和上三角)

(a1,1a1,2...a1,n1a1,na2,1a2,2...a2,n1a2,n...............an1,1an1,2...an1,n1an1,nan,1an,2...an,n1an,n)

策略:储对角线 + 下三角 行优先原则

按行优先原则将个元素存储得到一维数组中

需要数组的大小为1+2+3+...+n ---> (n+1)×n2

arr存储数组图片

ai,j是一维数组的第几个元素了?,ai,j前面有(1+2+3+i1)个元素,加上第j列的第j个元素就是ai,j的位置:(i1)×i2+j

由于数组下标从零开始,所以ai,j的位置:(i1)×i2+j1

即:ai,j=arr[(i1)×i2+j1]i>=j

策略:储对角线 + 下三角 列优先原则

需要数组的大小和行优先原则一样

arr存储数组图片

ai,j是一维数组的第几个元素了?,ai,j前面有(n+n1+n2+nj+2)个元素,加上第i行的第i个元素就是ai,j的位置:2nj+3j2n2j22+i

即:ai,j=arr[2nj+3j2n2j22+i1]i>=j

5.2、三角矩阵的压缩存储

上三角或者下三角的全是相同常数的矩阵,叫三角矩阵

(a1,1c...cca2,1a2,2...cc...............an1,1an1,2...an1,n1can,1an,2...an,n1an,n)或者(a1,1a1,2...a1,n1a1,nca2,2...a2,n1a2,n...............cc...an1,n1an1,ncc...can,n)

三角矩阵和对称矩阵差不多,只需要存储(对角线+下三角)或者(对角线+上三角);不过需要多加一个三角的常数

策略:储对角线 + 下三角 行优先原则

需要数组的大小为1+2+3+...+n+1 ---> (n+1)×n2+1

ai,j={arr[(i1)×i2+j1](i>=j)arr[(n+1)×n2](i<j)

5.3、三对角矩阵的压缩存储

(a1,1a1,20...00a2,1a2,2a2,3...00..................000...an1,n1an1,n000...an,n1an,n)

三对角矩阵又称带状矩阵,当|i-j|>1时候,ai,j=0 (i,j<=n)

按照行优先(列优先)原则只可以存存储带状部分

出了第一行和最后一行只有两个元素,其他行都有三个元素

需要数组的大小为:3n2

ai,j前面有i-1行,所以前面就有3(i1)1个元素;又是第i行的ji+2个元素;所以ai,j是第2i+j2个元素

即:ai,j=arr[2i+j3]

例:如果知道数组的第k的位置,怎么得到它的i,j了?

显然:3(i1)1<k<=3i1

i<(k+1)3+1

因为i为整数 i=(k+1)3+1

由于 k=2i+j3

所以j=k2i+3

5.4、稀疏矩阵的压缩存储

稀疏矩阵:非零元素的个数远远小于全部矩阵元素的个数

顺序压缩策略:

顺城存储:<行,列,值>

(010000002004000050000702003000)

i(行) j(列) v(值)
1 2 1
2 3 2
2 6 4
3 5 5
4 4 7
4 6 2
5 3 3

可以定义一个结构体:

struct Sparse{
int i;//行位置
int j;//列位置
ElemType v;//值的位置
};

十字链表:

可以定义两个结构体:

typedef struct OLNode{
int i;//行位置
int j;//列位置
ElemType v;//值的位置
struct OLNode *right,*down; //非零元素所在行和列的后继
}OLNode,*OLink;
typedef struct CrossList{
int mu,nu,tu;//矩阵的行数,列数,非零的个数
OLink *rhead,*chead;//稀疏矩阵的行和列的头指针
}CrossList;

(010000002004000050000702003000)

posted @   水三丫  阅读(583)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示