‘壹’ 对称矩阵的压缩存储
#include<iostream>
using namespace std;
int main()
{
int temp[1000];
int t[500][500];
int arry1[1000],arry2[1000];
int n;
scanf("%d",&n);
int i;
int m;
m=n*n+n;
m=m/2;
for(i=1;i<=m;i++)
{
scanf("%d",&arry1[i]);
}
for(i=1;i<=m;i++)
{
scanf("%d",&arry2[i]);
}
for(i=1;i<=m;i++)
{
temp[i]=arry1[i]+arry2[i];
}
int j;
int k;
for(i=1,k=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{ t[i][j]=temp[k];
k++;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j>i)
printf("%d",t[j][i]);
else
printf("%d",t[i][j]);
if(j!=n)
printf(" ");
}
printf("\n");
}
return 0;
}
‘贰’ 数据结构,根据对称矩阵,求某位置的地址
碰到这种,别去管什么0不0的,先弄清楚他的方式,下三角:
XOOOOOOOOO
XXOOOOOOOO
XXXOOOOOOO
XXXXOOOOOO
XXXXXOOOOO
XXXXXXOOOO
XXXXXXXOOO
XXXXXXXXOO
XXXXXXXXXO
XXXXXXXXXX
既然是从a[0][0]开始,a[7][5]是第8行第6个,一共多少个X?
前7行:1+2+3+4+5+6+7 = 28
第8行:6
28+6=34
‘叁’ 数据结构对称矩阵的压缩存储求数据地址
对对称阵进行压缩存取是将对称元素只存一个,并将数据存储在一维数组中
首先来确定a[i][j]在b[k]中的i,j与k的关系
首先是判定i与j的关系, 如果是下三角存储,则分一下两种情况
1、如果i<j, 则交换i与j的值,将上三角的位置值变换到下三角位置
2、如果i>=j,则不用执行操作直接走下面的流程
此时,i表示行坐标,j表示了坐标i之前有i行,即有1+2+...+i = (i+1)*i/2,在i标识的第i+1行有j+1个元素,由此可以确定k的值为(i+1)*i/2+j+1 = k+1 由此可得k = (i+1)*i/2+j
由此可以的,a[3][6], i=3, j=6, 由于i<j, 交换得i=6, j=3
由此 k = (6+1)*6/2+3 = 24
又由于&b[0] = 1000 每个元素占两个字节, 则b[24] = 1000+2*24 = 1048
由此便得到a[3][6]的地址为1048
‘肆’ 数据结构,对称矩阵.
k=i*(i+1)/2+j
‘伍’ 请问一下数据结构中对称矩阵的压缩存储的一 一对应关系怎么算的呀。
先看上面一个:
下三角有i>=j
第1行一个,第2行两个,。。。,第i-1行i-1个(i, j下标都是从1开始的)
所以第i行前有1+2+...+(i-1)= i(i-1)/2个元素
再看本行,本元素前有j-1个元素
因为计算的是元素之间的位置差,因此就是i(i-1)/2+(j-1)了
下面一个上三角i<j:
对于对称矩阵有a(i,j)=a(j,i),即行列互换,代入上式即可得