定义
稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组
普通数组:
对应的稀疏数组:
稀疏数组的存储方式
第一行存储 原始数据总行数, 总列数, 总的非0数据个数
接下来每一行都存储非0数所在行, 所在列, 和具体值
形如:
例如:
代码实现 原数组 -> 稀疏数组 -> 原数组
package com.coderzpw;
/**
* 稀疏数组
*/
public class SparseArray {
public static void main(String[] args) {
/**
* 创建一个原始的二维数组 n*m
* 0: 表示没有棋子, 1:表示黑子, 2: 表示白子
*/
int[][] chessArr1 = new int[11][11];
// 先初始化棋子的位置
chessArr1[1][2] = 1; // 第二行三列黑子
chessArr1[2][3] = 2; // 第三行四列白子
// 输出原始棋盘
System.out.println("原始的二维数组如下:");
for (int[] row: chessArr1) {
for (int item: row){
System.out.printf("%d\t", item);
}
System.out.println();
}
System.out.println("---------------------------------------------------------------------------");
/**
* 将二维数组 -> 稀疏数组
*/
// 1. 先遍历二维数组 得到非零数据的个数
int sum = 0; // 记录二维数组中非零的个数
for (int i=0; i<chessArr1.length; i++){
for (int j=0; j<chessArr1[i].length; j++){
if (chessArr1[i][j] != 0)
sum++;
}
}
// 2. 创建对应的稀疏数组
int[][] sparseArr = new int[sum+1][3];
//3. 给稀疏数组赋值
sparseArr[0][0] = chessArr1.length; // 稀疏数组第0行第1列表示原始数组的行数
sparseArr[0][1] = chessArr1[0].length; // 稀疏数组第0行第1列表示原始数组的列数
sparseArr[0][2] = sum; // 稀疏数组第0行第2列表示原始数组的非零个数
int count = 0; // 稀疏数组的行数
for (int i=0; i<chessArr1.length; i++){
for (int j=0; j<chessArr1[i].length; j++){
if( chessArr1[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
}
}
}
// 输出稀疏数组
System.out.println("对应的稀疏数组如下:");
for (int[] row: sparseArr){
System.out.printf("%d\t%d\t%d\t", row[0], row[1], row[2]);
System.out.println();
}
System.out.println("---------------------------------------------------------------------------");
/**
* 将稀疏数组 -> 二维数组
*/
// 1. 创建二维数组
int row = sparseArr[0][0];
int col = sparseArr[0][1];
int[][] chessArr2 = new int[row][col];
// 2. 给稀疏数组赋值
for (int i=1; i<sparseArr.length; i++){
int row0 = sparseArr[i][0];
int col0 = sparseArr[i][1];
int val = sparseArr[i][2];
chessArr2[row0][col0] = val;
}
// 输出还原后的二维数组
System.out.println("还原后的二维数组如下:");
for (int[] row1: chessArr2) {
for (int item: row1){
System.out.printf("%d\t", item);
}
System.out.println();
}
}
}