假如有一个4X4的二维数组

可以看到,这个数组大部分元素都是0,因此是一个稀疏数组,假如每一个元素都要存储,需要存储16个元素,大大浪费内存,因此我们在存储时只需要存储数组的必要信息跟非零元素,将原始数组转换为

进行存储,第一行表示原数组的规模跟非零元素的个数,第二行表示原数组第一个非零元素所在的行和列和非零元素的值,以此类推,转换后的数组元素个数为9,因此大大节省了存储空间
由以上分析,我们知道,一个稀疏数组进行压缩存储,压缩后数组的规模为:(sum+1)*3,其中sum表示稀疏数组中非零元素的个数,接下来,用java代码实现此转换
//定义稀疏数组,sparseArray[sum+1][3],sum为原数组非零元素个数
//1.遍历原始数组,确定非零元素个数
int sum = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (array[i][j] != 0) {
sum++;
}
}
}
//2.定义稀疏数组
int sparseArray[][] = new int[sum+1][3];
//3.给稀疏数组赋初值
sparseArray[0][0] = 4;
sparseArray[0][1] = 4;
sparseArray[0][2] = sum;
//4.将原始数组的非零元素存入稀疏数组
int count = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (array[i][j] != 0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = array[i][j];
}
}
}
//5.输出稀疏数组
System.out.println("*************稀疏数组*************");
for (int[] row : sparseArray) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println();
}
System.out.println("*************稀疏数组*************");
同样,也可以通过压缩后的数组转换为原数组
//稀疏数组转为原始数组
int array1[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
int sum1 = sparseArray[0][2];
for (int i = 1; i <= sum1; i++) {
array1[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
//打印原始数组
System.out.println("*************原始数组*************");
for (int[] row : array1) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println();
}
System.out.println("*************原始数组*************");
运行后的效果为:

本文介绍了如何对稀疏数组进行压缩存储以节省内存,压缩后数组规模为(非零元素个数+1)*3。通过示例展示了从4x4稀疏数组到压缩数组的转换,并用Java代码实现该过程,以及从压缩数组恢复原数组的方法。

589

被折叠的 条评论
为什么被折叠?



