稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组
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 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
其稀疏数组形式:
11 11 2
1 2 1
2 4 2
刚说到稀疏数组是一种压缩后的数组,为什么要进行压缩存储呢?
-
原数组中存在大量的无效数据,占据了大量的存储空间,真正有用的数据却少之又少
-
压缩存储可以节省存储空间以避免资源的不必要的浪费,在数据序列化到磁盘时,压缩存储可以提高IO效率
下面看看我怎么实现一个稀疏数组:
1.创建一个原始的二维数组11*11,并存上几个数据
int [][]chessArr1=new int[11][11];
chessArr1[1][2]=1;
chessArr1[2][3]=2;
chessArr1[8][7]=9;
System.out.println("原始二维数组:");
2.先遍历二维数组,得到非零的个数
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++;
}
}
}
3.创建一个稀疏数组,并输入稀疏数组第一行的数据
int sparseArr[][]=new int[sum+1][3];
int count=0;
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=sum;
4. 将二维数组中非零的数据输入稀疏数组中
for(int i=0;i<11;i++){
for (int j=0;j<11;j++){
if (chessArr1[i][j]!=0){
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=chessArr1[i][j];
}
}
}
然后我们可以遍历两个数组,查看一下具体情况,我就不遍历了。
5.稀疏数组恢复二维数组
int chessArr2[][]=new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i=1;i<sparseArr.length;i++){
chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}