稀疏数组使用场景
- 当一个数组中大部分元素为零,或者为同一值时,就可以使用稀疏数组来保存以节约内存空间
为什么能节约内存空间?
如下图二维数组,数据量非常的冗余繁杂
当把它转化为稀疏数组的时候
这样数据就会显得非常干净整洁
稀疏数组是如何记录数据的
- 如上图所示
- 稀疏数组只有三行
- 稀疏数组的第0行主要是记录原数组有几行、几列、多少个有效值。
假设我们设定稀疏数组的名称为array2。
array2[0][0]=原数组的行数
array2[0][1]=原数组的列数
array2[0][2]=原数组的有效值数量。 - 从稀疏数组的第一行开始往下的行都是记录原数组有效值的坐标和值的大小。
- 假设我们设定原数组行为 i,列为j,值为p,稀疏数组的行为n
array2[n][0]=i
array2[n][1]=j
array2[n][2]=p
用JAVA代码实现上图二维数组转换成稀疏数组。
public class DemoDoForMyself {
public static void main(String[] args) {
//把原数组构造出来
int[][] array=new int[6][7];
array[0][3]=22;
array[0][6]=15;
array[1][1]=11;
array[1][5]=17;
array[2][3]=-6;
array[3][5]=39;
array[4][0]=97;
array[5][2]=28;
//使用增强型for循环,获取原数组有效值个数,使用valueNumber接收
int valueNumber=0;
for (int[] a:array
) {
for (int b:a
) {
if(b!=0){
valueNumber++;
}
}
}
//创建一个稀疏数组
int[][] array2=new int[valueNumber+1][3];
//给稀疏数组第零行赋值
array2[0][0]= array.length;
for (int i = 0; i <array.length ; i++) {
for (int j = 0; j <array[i].length ; j++) {
array2[0][1]= array[i].length;
}
}
array2[0][2]=valueNumber;
//给稀疏数组第零行打后的每一行赋值
int count=0;//定义count为有效值获得个数同时也为稀疏数组的行数
for (int i =0; i <array.length ; i++) {
for (int j = 0; j <array[i].length ; j++) {
if(array[i][j]!=0){
count++;
array2[count][0]=i;
array2[count][1]=j;
array2[count][2]=array[i][j];
}
}
}
//输出稀疏数组
System.out.println("以普通for循环输出");
for (int i = 0; i <array2.length ; i++) {
System.out.println(array2[i][0]+"\t"+array2[i][1]+"\t"+array2[i][2]);
}
System.out.println("===========");
System.out.println("以增强型for循环输出");
for (int[]x:array2
) {
for (int y:x
) {
System.out.println(y);
}
System.out.println();
}
/*
还原稀疏数组
*/
int[][] array3=new int[array2[0][0]][array2[0][1]];
for (int i = 1; i <array2.length ; i++) {
array3[array2[i][0]][array2[i][1]]=array2[i][2];
}
System.out.println("输出还原数组");
for (int[] x:array3
) {
for (int y:x
) {
System.out.print(y+"\t");
}
System.out.println();
}
}
}
[本文章具体参考至狂神JAVA](https://www.bilibili.com/video/BV12J41137hu?p=59)