稀疏矩阵
什么是稀疏矩阵
稀疏矩阵是一个矩阵中,有效值是很少,大多数的值是无效值的0。类似的应用场景是,在五子棋中,二维数组的0表示没有下子的位置过多的占用了空间,可用稀疏矩阵进行压缩。
步骤
将一个稀疏矩阵转化为记录矩阵
- 遍历完整的矩阵,得到有效的数据个数,并将其记录下来。
//创建一个10*10二维数组
//其中0表示没有下子,1表示下黑子,2表示下白子
int chessArry[][] = new int[10][10];
chessArry[1][2] = 1;
chessArry[2][3] = 2;
//打印棋盘出来看看
System.out.println("原始二维棋盘的内容:");
for (int[] row : chessArry) {
for (int data : row){
System.out.printf("%d\t", data);
}
System.out.println();
}
//将 二维数组 转化为 稀疏数组
//1. 先遍历二维数组,得到非0的数的个数
//System.out.println(chessArry.length);
int sum = 0;
int row[] = new int[chessArry.length];
int low[] = new int[chessArry.length];
for(int i = 0; i< chessArry.length; i++){
for (int j = 0; j < chessArry.length; j++){
if(chessArry[i][j] != 0){
row[sum] = i;
low[sum] = j;
sum++;
}
}
}
- 创建一个稀疏矩阵,第一行是原始矩阵的行数,列数,和有效值个数,接下来sum列是点的位置坐标和点的值,将其组成一个[sum+1][3]的数组
//2. 创建一个稀疏数组
int sparseArry[][] = new int[sum+1][3];
sparseArry[0][0] = chessArry.length;
sparseArry[0][1] = chessArry.length;
sparseArry[0][2] = sum;
for(int i = 1; i< sum + 1; i++) {
sparseArry[i][0] = row[i-1];
sparseArry[i][1] = low[i-1];
sparseArry[i][2] = chessArry[row[i-1]][low[i-1]];
}
- 将稀疏矩阵恢复成原始矩阵
//4. 将稀疏数组恢复成原始数组
int[][] chessArry1 = new int[sparseArry[0][0]][sparseArry[0][1]];
for(int i = 0; i < sparseArry[0][2]; i++){
chessArry1[sparseArry[i+1][0]][sparseArry[i+1][1]] = sparseArry[i+1][2] ;
}