稀疏数组概念
当一个数组仅包含一定的数据,其他的都是初始化数据
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
如果存储该数据,会浪费空间
可以通过稀疏数组表示:
row col val
0 11 11 2
1 1 2 1
2 2 3 2
稀疏数组可以看出数组的压缩,仅普通数组的值无效数据量远大于有效数据量时使用
实现思想
二维数组转换为稀疏数组,其中稀疏数组:
- 第一行:第一列表示有多少行,第二列表示有多少列,第三列表示有多少个数据
- 后续行表示具体的数据:第一列表示该数据行号,第二列表示该数据列号,第三列表示数据值
只需遍历二维数组,将数组转为稀疏数组即可
稀疏数组通过读取稀疏数组即可转二维数组
Java实现
package com.company.sparsearray;
/**
* 稀释数组
* @author zfk
*/
public class SparseArray {
/**
* @param chessArr1
* 将二维数组 转为 稀释数组
*/
public static int[][] arrayToSparse(int[][] chessArr1){
//1. 先遍历二维数组,得到非0数据的个数
int sum = 0;
for (int i = 0;i < 11;i++){
for (int j = 0;j < 11;j++){
if (chessArr1[i][j] != 0){
sum++;
}
}
}
//2. 创建对应的稀释数组
int[][] sparseArray = new int[sum+1][3];
//3. 给稀释数组赋值
sparseArray[0][0] = 11;
sparseArray[0][1] = 11;
sparseArray[0][2] = sum;
//遍历二维数组,将非零的值存放到稀疏数组
//count记录这是第几个非零数据
int count = 0;
for (int i = 0;i < 11;i++){
for (int j = 0;j < 11;j++){
if (chessArr1[i][j] != 0){
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chessArr1[i][j];
}
}
}
//4. 输出稀疏数组的形式
System.out.println("=== 得到的稀疏数组 ===");
for (int i = 0;i < sparseArray.length;i++){
System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
}
return sparseArray;
}
/**
* @param sparseArray
* 将稀疏数组恢复成原始的二维数组
*/
public static void sparseToArray(int[][] sparseArray){
//1 . 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
int[][] chessArr2 = new int[sparseArray[0][0]][sparseArray[0][1]];
//2. 读取稀疏数组的后几行,从第二行开始
for (int i = 1;i < sparseArray.length;i++){
chessArr2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
// 输出恢复后的二维数组
System.out.println("=== 恢复后的二维数组 ===");
for (int[] row : chessArr2){
for (int data : row){
System.out.printf("%d \t",data);
}
System.out.println();
}
}
public static void main(String[] args) {
//创建一个原始的二维数组 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 data : row){
System.out.printf("%d \t",data);
}
System.out.println();
}
//将二维数组 转为 稀释数组
int[][] sparseArray = arrayToSparse(chessArr1);
//将稀疏数组 还原 二维数组
sparseToArray(sparseArray);
}
}
结果:
=== 原始的二维数组 ===
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
=== 得到的稀疏数组 ===
11 11 2
1 2 1
2 3 2
=== 恢复后的二维数组 ===
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
稀疏数组的使用:通常是在需要存储数组数据,但数组中有效数据较少时,将数组转为稀疏数组,即可节省空间