数据结构——特殊矩阵的压缩存储

数据结构——特殊矩阵的压缩存储

矩阵的压缩存储:将矩阵的元素按照某种分布规律存储在较小的存储单元中。

1、对称矩阵的压缩存储

          n阶对称矩阵:一个n阶的矩阵A中的元素满足a(ij)=a(ji)(0
数据结构——特殊矩阵的压缩存储_第1张图片
(使用等差数列公式就可以推导出来,下同)
#include 
#include 
#include 
#include 
/**对称矩阵压缩存储**/
void PrintMatrix(double *s,int n);
/**存储对称矩阵**/
void storeMatrix(int n){
	double *s = new double[n];
	int len = n*(n+1)/2;
	printf("Input the UP_Matrix's element by the order of row\n");
	for(int i = 0;i=j)	k = i*(i+1)/2+j;
			else	k = j*(j+1)/2+i;
			printf("%d\t",s[k]);
		}
		printf("\n");
	}
	
}
void main(){
	int n = 0 ;
	printf("Input the order of the matrix:");
	scanf("%d",&n);
	storeMatrix(n);
	system("pause");
}

2、三角矩阵的压缩存储

      上三角矩阵:下三角元素均为常数的矩阵。
      下三角矩阵:上三角元素均为常数的矩阵。
       跟对称矩阵存储相似,只是一位数组s的最后一位用来存储常数项。而且这里的上三角矩阵的存储相当于对称矩阵的以列为主的压缩存储。
数据结构——特殊矩阵的压缩存储_第2张图片

3、对角矩阵的压缩存储

      对角矩阵:所有非零元素集中在主对角线两侧的带状区域内。m对角矩阵是指非零元素在每行中有m个,如下图为三对角矩阵。
数据结构——特殊矩阵的压缩存储_第3张图片
      特点:
  • 第一行和最后一行有2个非零元素,第2-n-1行有3个非零元素
  • 前i-1行有3*(i-1)-1个非零元素,第i行的非零元素个数为j-i+1当ji时j-i=1
  • 使用一维数组存储,需要存储3*n-2个元素
  • 一维数组s[k]和A[i][j]的对应关系为:k = 2*i+j

4、稀疏矩阵的压缩存储

      稀疏矩阵:大多数元素均为零的矩阵。定义矩阵m*n如果有t个非零元素,那么s = t/m*n称为矩阵的稀疏因子,如果s<=0.05那么矩阵为稀疏矩阵。
       数据对象集合:稀疏矩阵可以使用三元组顺序表表示,其中三元组格式为(i,j,e)记录了非零元素的行号、列号以及非零元素。
数据结构——特殊矩阵的压缩存储_第4张图片
      基本操作集合:
  • CreateMatrix(&M):创建稀疏矩阵
  • DestroyMatrix(&M):销毁稀疏矩阵
  • PrintMatrix(M):打印稀疏矩阵
  • CopyMatrix(M,&N):复制稀疏矩阵M到N
  • AddMatrix(M,N,&Q):矩阵加法
  • SubMatrix(M,N,&Q):矩阵减法
  • MultiMatrix(M,N,&Q):矩阵乘法
  • TransposeMatrix(M,&N):矩阵转置

代码实现:

#include 
#include 
#include 
#include 
/**稀疏矩阵压缩存储**/
#define MAXSIZE 100
typedef struct 
{
	int i;
	int j;
	int e;
}Triple;
typedef struct 
{
	Triple data[MAXSIZE];
	int m,n,len;
}Matrix;
//函数声明
int CreateMatrix(Matrix *M);
void DestroyMatrix(Matrix *M);
void PrintMatrix(Matrix M);
void CopyMatrix(Matrix M,Matrix *N);
int CompareNumber(int a,int b);
int AddMatrix(Matrix M,Matrix N,Matrix *Q);
int SubMatrix(Matrix M,Matrix N,Matrix *Q);
void TransposeMatrix(Matrix M,Matrix *N);
/**创建一个稀疏矩阵**/
int CreateMatrix(Matrix *M){
	//创建成功返回1
	int i,m,n,len;
	int e;
	int flag;
	printf("Input the Matrix's row,col and the number of non-zero element:");
	scanf("%d%d%d",&m,&n,&len);
	if(len>MAXSIZE)
		return 0;
	M->len = len;
	M->m = m;
	M->n = n;
	//以行为主录入非零元素
	for(i = 0;im,M->n);
			scanf("%d%d%d",&m,&n,&e);
			flag = 0;
			if(m<0||n<0||m>M->m||n>M->n)
				flag = 1;
			if(i>0&&mdata[i-1].i||m==M->data[i-1].i&&ndata[i-1].j)
				flag = 1;
		}while(flag);
		M->data[i].i = m;
		M->data[i].j = n;
		M->data[i].e = e;
	}
	return 1;
}
/**销毁一个稀疏矩阵**/
void DestroyMatrix(Matrix *M){
	M->len = 0;
	M->m = 0;
	M->n = 0;
}
/**打印矩阵**/
void PrintMatrix(Matrix M){
	int len  = M.len;
	printf("k\ti\tj\te\n");
	for(int i = 0;ilen = len;
	N->m = M.m;
	N->n = M.n;
	for(int i =0 ;idata[i].i = M.data[i].i;
		N->data[i].j = M.data[i].j;
		N->data[i].e = M.data[i].e;
	}
}
int CompareNumber(int a,int b){
	if(am = M.m;
	Q->n = M.n;
	while(mdata[++k] = M.data[m++];
			break;
		case 0:
			switch (CompareNumber(M.data[m].j,N.data[n].j))
			{
			case -1:
				Q->data[++k] = M.data[m++];
				break;
			case 0:
				Q->data[++k] = M.data[m++];
				Q->data[k].e += N.data[n++].e;
				if(Q->data[k].e==0){
					k--;
				}
				break;
			case 1:
				Q->data[++k] = N.data[n++];
				break;
			}
			break;
		case 1:
			Q->data[++k] = N.data[n++];
			break;
		}
	}
	while(mdata[++k] = M.data[m++];
	}
	while(ndata[++k] = N.data[n++];
	}
	Q->len = k+1;
	if(k>MAXSIZE){
		printf("ERROR!Out of bound!");
		return 0;
	}
	return 1;
}
/**矩阵减法**/
//只需要将第二个矩阵的每个元素取反然后进行加法即可
int SubMatrix(Matrix M,Matrix N,Matrix *Q){
	//相减成功返回1
	int len = N.len;
	for(int i=0;im = M.m;
	N->n = M.n;
	N->len = M.len;
	if(N->len){
		for(col=0;coldata[k].i =M.data[i].j;
			N->data[k].j = M.data[i].i;
			N->data[k].e = M.data[i].e;
			position[col]++;
		}
	}
	free(num);
	free(position);
}
void main(){
	Matrix m1,m2,m3,m4,m5;
	CreateMatrix(&m1);
		PrintMatrix(m1);
		CopyMatrix(m1,&m2);
		printf("--------------\n\n");
		PrintMatrix(m2);
		AddMatrix(m1,m2,&m3);
		printf("--------------\n\n");
		PrintMatrix(m3);
		SubMatrix(m3,m2,&m4);
		printf("--------------\n\n");
		PrintMatrix(m4);
		TransposeMatrix(m4,&m5);
		printf("--------------\n\n");
		PrintMatrix(m5);
		DestroyMatrix(&m1);
		printf("--------------\n\n");
		PrintMatrix(m1);
	system("pause");
}





你可能感兴趣的:(数据结构与算法)