1、什么是对称矩阵
这就是一个4阶矩阵,红色为对角线。除对角线的元素,关于对角线的元素值相等。
2、问题的由来
对于N阶矩阵,有n*n个元素,如果采用二维数组存储,则需要对应数量的存储单元,可以利用对阵矩阵中
a[i][j] = a[j][i]的特点,使用更少的空间存储该矩阵。
3、解决方案
不废话,先上源代码,数组采用按行存储优先。
int[][] a1 = new int[5][5];
for(int i=0;i<5;i++){
for(int j=i;j<5;j++){
a1[i][j] = (int) Math.round(Math.random()*100);
if(i!=j) a1[j][i] =a1[i][j];
}
int[] b = new int[5*6/2];
for(int i=0;i<5;i++){
for(int j=0;j<=i;j++){
b[i*(i+1)/2+j] = a1[i][j];
}
}
}
使用整数的二维数组来生成原始矩阵。
生成的矩阵如下
53, 71, 11, 11, 27
71, 40, 21, 61, 35
11, 21, 45, 77, 60
11, 61, 77, 82, 76
27, 35, 60, 76, 13
压缩存储后如下
[53, 71, 40, 11, 21, 45, 11, 61, 77, 82, 27, 35, 60, 76, 13]
可以减少的存储空间为 n(n-1)/2。
4 扩展
三角矩阵也可以进行压缩存储,其可以看成是0元素侧不需要存储的对称矩阵。