5、矩阵的压缩存储
5.1、对称矩阵的压缩存储
若n阶矩阵任意一个元素,都有的ai,j=aj,i的矩阵称为对称矩阵,
普通存储:二位数组存储需要n*n个位置
压缩存储策略:值存储对角线和下三角(或者对角线和上三角)
⎛⎜
⎜
⎜
⎜
⎜
⎜⎝a1,1a1,2...a1,n−1a1,na2,1a2,2...a2,n−1a2,n...............an−1,1an−1,2...an−1,n−1an−1,nan,1an,2...an,n−1an,n⎞⎟
⎟
⎟
⎟
⎟
⎟⎠
策略:储对角线 + 下三角 行优先原则
按行优先原则将个元素存储得到一维数组中
需要数组的大小为1+2+3+...+n ---> (n+1)×n2
arr存储数组图片

ai,j是一维数组的第几个元素了?,ai,j前面有(1+2+3+i−1)个元素,加上第j列的第j个元素就是ai,j的位置:(i−1)×i2+j个
由于数组下标从零开始,所以ai,j的位置:(i−1)×i2+j−1
即:ai,j=arr[(i−1)×i2+j−1](i>=j)
策略:储对角线 + 下三角 列优先原则
需要数组的大小和行优先原则一样
arr存储数组图片

ai,j是一维数组的第几个元素了?,ai,j前面有(n+n−1+n−2+n−j+2)个元素,加上第i行的第i个元素就是ai,j的位置:2nj+3j−2n−2−j22+i个
即:ai,j=arr[2nj+3j−2n−2−j22+i−1](i>=j)
5.2、三角矩阵的压缩存储
上三角或者下三角的全是相同常数的矩阵,叫三角矩阵
⎛⎜
⎜
⎜
⎜
⎜
⎜⎝a1,1c...cca2,1a2,2...cc...............an−1,1an−1,2...an−1,n−1can,1an,2...an,n−1an,n⎞⎟
⎟
⎟
⎟
⎟
⎟⎠或者⎛⎜
⎜
⎜
⎜
⎜
⎜⎝a1,1a1,2...a1,n−1a1,nca2,2...a2,n−1a2,n...............cc...an−1,n−1an−1,ncc...can,n⎞⎟
⎟
⎟
⎟
⎟
⎟⎠
三角矩阵和对称矩阵差不多,只需要存储(对角线+下三角)或者(对角线+上三角);不过需要多加一个三角的常数
策略:储对角线 + 下三角 行优先原则

需要数组的大小为1+2+3+...+n+1 ---> (n+1)×n2+1
ai,j=⎧⎨⎩arr[(i−1)×i2+j−1](i>=j)arr[(n+1)×n2](i<j)
5.3、三对角矩阵的压缩存储
⎛⎜
⎜
⎜
⎜
⎜
⎜⎝a1,1a1,20...00a2,1a2,2a2,3...00..................000...an−1,n−1an−1,n000...an,n−1an,n⎞⎟
⎟
⎟
⎟
⎟
⎟⎠
三对角矩阵又称带状矩阵,当|i-j|>1时候,ai,j=0 (i,j<=n)
按照行优先(列优先)原则只可以存存储带状部分

出了第一行和最后一行只有两个元素,其他行都有三个元素
需要数组的大小为:3n−2
ai,j前面有i-1行,所以前面就有3(i−1)−1个元素;又是第i行的j−i+2个元素;所以ai,j是第2i+j−2个元素
即:ai,j=arr[2i+j−3]
例:如果知道数组的第k的位置,怎么得到它的i,j了?
显然:3(i−1)−1<k<=3i−1
i<(k+1)3+1
因为i为整数 i=⌊(k+1)3+1⌋
由于 k=2i+j−3
所以j=k−2i+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⎞⎟
⎟
⎟
⎟
⎟
⎟⎠

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix