特殊矩阵(对称矩阵)的压缩存储和解压缩
参考书目:严蔚敏《数据结构》P95-96
一、背景
矩阵在工程计算中经常使用,对于一些特殊矩阵,比如对称矩阵,稀疏矩阵……有时为了节省空间,可以对这类矩阵进行压缩存储。这里只讨论对称矩阵,上(下)三角矩阵和对角矩阵,掌握其他类似对称矩阵就很容易了
二、压缩原则
为多个值相同的元素只分配一个存储空间,对零元素不分配空间。
三、对称矩阵的压缩
-
性质:
0<=i,j<=n-1
(在 程序中 数组下标是从 0 开始的)举例:
-
压缩:以行序为主序存储下三角(包括对角线)元素
-
推导如下:
①为书上的方法
②自己想的一种,在压缩 对角矩阵 时会多节省一点空间
四、程序实现 4阶 对称矩阵压缩
4阶矩阵压缩(后面会总结 n阶 )
#include <iostream>
using namespace std;
//原始矩阵
int a[4][4]=
{
{0,4,5,6},
{4,1,7,8},
{5,7,2,9},
{6,8,9,3}};
//压缩矩阵
int Sa1[10];
int Sa2[10];
//通过压缩矩阵复原 原矩阵
int a1[4][4] = {0};
void Printa()
{
for(int i=0; i<4; i++)
{
for(int j=0; j<4; j++)
cout << a[i][j] << "\t";
cout << endl;
}
cout << endl;
}
void MatrixCompression1()//矩阵压缩 1
{
for(int i=0; i<4; i++)
{
for(int j=0; j<=i; j++)
{
int k = i*(i+1)/2+j;
Sa1[k] = a[i][j];
}
}
}
void MatrixCompression2()//矩阵压缩 2
{
for(int i=0; i<4; i++)
{
for(int j=0; j<=i; j++)
{
int m = i-j;
int k = 4*m-m*(m-1)/2+j;
Sa2[k] = a