- 问题引入:
因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据,所以我们可以把普通的二维数组转为稀疏数组,可以减少内存占用。
- 概念:
-
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
-
1.记录数组一共有几行几列,有多少个不同的值
- 2.把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
/*以象棋为例,创建原始二维数组5*5,设0表示没有棋子,1 黑子,2 白子*/
public static int[][] Init() {
int[][] chessArr = new int[5][5];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
//输出原始数组
for (int[] row : chessArr) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println("\n");
}
return chessArr;
}
- 二维数组 -> 稀疏数组的思路
1. 遍历原始的二维数组,得到有效数据的个数sum
2. 根据sum 就可以创建 稀疏数组 sparseArr ( int[sum + 1] [3])
3. 将二维数组的有效数据数据存入到 稀疏数组
/*二维数组 -> 稀疏数组*/
public static int[][] ChessArrToSparseArr(int[][] chessArr) {
System.out.println("-----------------------------------------");
//1. 遍历原始的二维数组,得到有效数据的个数count
int count = 0, r = 0, c = 0;
for (int[] row : chessArr) {
r++;
for (int data : row) {
c = row.length;
if (data != 0) count++;
}
}
System.out.println("二维数组元素总数为" + count + ',' + "行数为" + r + ',' + "列数为" + c);
//2. 根据 count 创建 稀疏数组 sparseArr int[count + 1] [3]
int[][] sparseArr = new int[count + 1][3];
//3. 将二维数组的有效数据数据存入到 稀疏数组
int index = 0;
sparseArr[index] = new int[]{r, c, count};
index += 1;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (chessArr[i][j] != 0) {
sparseArr[index++] = new int[]{i, j, chessArr[i][j]};
}
}
}
System.out.println("得到的稀疏数组为:");
for (int[] row : sparseArr) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println("\n");
}
return sparseArr;
}
- 稀疏数组 -> 原始的二维数组的思路
1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
2. 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可.
/*稀疏数组 -> 二维数组*/
public static int[][] SparseArrToChessArr(int[][] sparseArr) {
System.out.println("-----------------------------------------");
//1.初始化一个新二维数组
int[][] chessArr = new int[sparseArr[0][0]][sparseArr[0][1]];
//2.根据稀疏数组中每一行的数据将二维数组中对应位置赋值
for (int i = 1; i < sparseArr.length; i++) {
chessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
System.out.println("恢复后的原始数组为:");
for (int[] row : chessArr) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println("\n");
}
return chessArr;
}
示例结果:
0 0 0 0 0
0 0 1 0 0
0 0 0 2 0
0 0 0 0 0
0 0 0 0 0
-----------------------------------------
二维数组元素总数为2,行数为5,列数为5
得到的稀疏数组为:
5 5 2
1 2 1
2 3 2
-----------------------------------------
恢复后的原始数组为:
0 0 0 0 0
0 0 1 0 0
0 0 0 2 0
0 0 0 0 0
0 0 0 0 0
进程已结束,退出代码为 0