稀疏数组
稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组
为什么要进行压缩存储呢?
-
原数组中存在大量的无效数据,占据了大量的存储空间,真正有用的数据却少之又少
-
压缩存储可以节省存储空间以避免资源的不必要的浪费,在数据序列化到磁盘时,压缩存储可以提高IO效率
面临的实际需求:
在编写五子棋程序中,我们要实现一个存盘退出 和续上盘的功能。
当我们用用二维数组记录棋盘
分析问题:
在棋盘刚开始时,二维数组大多数元素默认为0,因此记录了大量的没有意义的数据!!
当一个数组中大部分元素为0,或者为同一个数组时,可以用稀疏数组来保存该数组。
稀疏数组的处理方法是:
①记录数组一共有几行几列,有多少个不同的值
②把具有不同值的元素的行列和值记录在一个小规模数组中(稀疏数组)从而缩小程序的规模。
二维数组和稀疏数组的相互转换
图解
Java代码实现
package sparsearray;
//稀疏数组
public class SparseArray {
public static void main(String[] args) {
//创建一个原始的二维数组11*11
//0--没有棋子 1--黑子 2--白子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
//输出原始的二维数组
System.out.println("输出原始的二维数组:");
for (int[]row:chessArr1){//外循环输出的是二维数组的一维数组row
for (int data:row){//一维数组row循环输出对应的date
System.out.print(data+"\t");
}
System.out.println();
}
//将二维数组转换成稀疏数组
//①先遍历二维数组 得到非零数据的个数
int sum = 0;
for (int i = 0; i<11;i++)
for (int j = 0;j<11;j++){
if (chessArr1[i][j]!=0)
sum++;
}
//②创建对应的稀疏数组
int spareArr[][] = new int[sum+1][3];//稀疏数组总是3列
// 给稀疏数组赋值
spareArr[0][0] = 11;
spareArr[0][1] = 11;
spareArr[0][2] = sum;
//遍历二维数组将非零的量存放到稀疏数组
int count = 0;//count 用于记录第几个非零数据
for (int i = 0; i<11;i++)
for (int j = 0;j<11;j++){
if (chessArr1[i][j]!=0) {
count++;
spareArr[count][0] = i;
spareArr[count][1] = j;
spareArr[count][2] = chessArr1[i][j];
}
}
//输出稀疏数组的形式
System.out.println();
System.out.println("得到的稀疏数组为:");
for (int i = 0;i < spareArr.length;i++) {
for (int j = 0; j < 3; j++) {
System.out.print(spareArr[i][j] + "\t");
}
System.out.println();
}
//稀疏数组-----> 二维数组
/*①先读取稀疏数组的第一行,根据第一行创建二维数组
* ②在读取稀疏数组的后几行数据,并赋值给原始的二维数组*/
int chassArr2[][] = new int[spareArr[0][0]][spareArr[0][1]];
for (int i =1;i< spareArr.length;i++)
chassArr2[spareArr[i][0]][spareArr[i][1]] = spareArr[i][2];
//输出恢复后的二维数组
System.out.println();
System.out.println("恢复后的二维数组:");
for (int[]row:chessArr1){//外循环输出的是二维数组的一维数组row
for (int data:row){//一维数组row循环输出对应的date
System.out.print(data+"\t");
}
System.out.println();
}
}
}
代码运行结果:
输出原始的二维数组:
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 0Process finished with exit code 0