對稱矩陣與壓縮儲存演算法(java實現)
阿新 • • 發佈:2018-11-26
一、問題描述
實現一個對稱矩陣的壓縮儲存
二、演算法分析
對稱矩陣的特點:a[i][j] = a[j][i].即所有元素關於對角線對稱
所以可以將對稱矩陣的下三角儲存在一個數組物件SA中,儲存方式是,
SA[0] = a[0][0]
SA[1] = a[1][0] SA[2] = a[1][1]
SA[3] = a[2][0] SA[4] = a[2][1] SA[5] = a[2][2]
。。。
通過分析可得, a[i][j] = SA[i*(i+1)/2+j],其中i表示行,j表示列
三、演算法設計
建立一個類SymmetricMatrix
成員變數:
private static final int N = 3;
int[][] a = new int[N][N];
int[] SA = new int[N * (N + 1) / 2];
成員方法:
public void init() 根據矩陣初始化陣列SA
public printMatrix 列印對稱矩陣
public find(int i, int j) 查詢矩陣中第i行第j列的元素,查詢物件SA
四、編碼實現
public class SymmetricMatrix { private static final int N = 3; int[][] a = new int[N][N]; int[] SA = new int[N * (N + 1) / 2]; public void init(){ for(int i=0; i<N; i++){ for(int j=0;j<=i;j++){ a[i][j] = a[j][i] = i+j; } } int count = 0; for(int i=0;i<N; i++){ for(int j=0;j<=i;j++){ SA[count] = a[i][j]; count++; } } } public void printMatrix(){ for(int i=0; i<N; i++){ for(int j=0;j<N;j++){ System.out.print(a[i][j]+" "); } System.out.println(); } } public int find(int i,int j){ return SA[i*(i+1)/2+j]; } public void printSA(){ for (int i : SA) { System.out.print(i+" "); } } public static void main(String[] args) { SymmetricMatrix matrix = new SymmetricMatrix(); matrix.init(); matrix.printMatrix(); matrix.printSA(); int result = matrix.find(0, 0); System.out.println(); System.out.println(result); } }