目录
对称矩阵
若 n 阶矩阵A中的元素满足下述性质: aij=aji 则称为 n 阶对称矩阵。
对于对称矩阵,可以为每一对元素分配一个存储空间,则可将 n^2个元素压缩存储到 n(n+1)/2个元素的空间中。例如,只存储下三角中的元素aij,其特点是j<=i且0<=i<=n-1,对于上三角中的元素aij,它和对应的aji相等,因此当访问的元素在上三角时,直接去访问和它对应的下三角元素即可,这样,原来需要 n^2个存储单元,现在只需要n(n+1)/2个存储单元了,节约了n(n-1)/2个存储单元。
假设以一维数组 sa[n(n+1)/2]作为 n 阶对称矩阵A的压缩存储结构,以行序为主序存储其下三角,则 sa[ k ]和矩阵元素aij之间存在着一一对应的关系:
当i>=j时,k=i(i+1)/2+j
当i<j时,k=j(j+1) /2+i
对于矩阵中任意给定一组下标(i,j),均可在 sa[ ]中找到对应的矩阵元素aij;反之,对所有的k=0,1,2……n(n+1)/2-1都能确定 sa[ k ]中的元素在矩阵中的位置(i,j)或(j,i)。由此,称 sa[n(n+1)/2]为 n 阶对称矩阵A的压缩存储结构。
问题描述
【问题描述】
实现对称矩阵的压缩存储。
【输入形式】
输入一个5阶对称矩阵。矩阵元素均为整型。
【输出形式】
输出进行压缩存储后的一维数组,元素值之间以空格区分。
【样例输入】
3 6 4 7 8
6 2 8 4 2
4 8 1 6 9
7 4 6 0 5
8 2 9 5 7
【样例输出】
3 6 2 4 8 1 7 4 6 0 8 2 9 5 7
代码实现
#include<stdio.h>
#define MAXSIZE 12500
typedef int ElemType;
typedef struct
{
int i,j;
ElemType e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];
int mu,nu;
}TSMatrix;
void Init(TSMatrix *t)
{
t->mu = 5;
t->nu = 5;
}
void Create(TSMatrix *t)
{
int x, a = 0 , b = 0 , q = 0;
while(a < 5)
{
scanf("%d",&x);
t->data[q].i = a;
t->data[q].j = b;
t->data[q].e = x;
b ++ ;
q ++ ;
if(b >= 5)
{
printf("\n");
a ++;
b = 0;
}
}
}
void Print(TSMatrix *t)
{
int q;
for(q=0 ; q < t->mu * t->nu ; q++)
{
if(t->data[q].j <= t->data[q].i)
printf("%d ",t->data[q].e);
}
}
int main()
{
TSMatrix M;
Init(&M);
Create(&M);
Print(&M);
return 0;
}