稀疏数组:
当一个数组中大部分元素为零,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
处理方法:
1.记录数组有几行几列,有多少不同的值。
2.把具有不同值的元素的行列数及其值记录在另一个小规模数组中,从而缩小数组的规模。
上图转换成稀疏数组为:
rol | col | val | |
0 | 11 | 11 | 2 |
1 | 1 | 2 | 1 |
2 | 2 | 3 | 2 |
二维数组转稀疏数组步骤:
1.遍历原始二维数组,得到有效的个数sum;
2.根据sum创建稀疏数组sparseArr int [sum+1][3];
3.将二维数组的有效数据存入到稀疏数组中。
稀疏数组转换成二维数组步骤:
1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组;
2.再读取稀疏数组后几行的数据,并赋给二维数组即可。
代码实现:
package com.atguigu.aparsearr;
public class sparseArr {
public static void main(String[] args) {
// 先创建原始的二维数组11*11
int arr1[][]=new int [11][11];
arr1[1][2]=1;//初始化原始二维数组
arr1[2][3]=2;
// 输出原始二维数组
System.out.println("原始二维数组");
for(int[]row:arr1) {
for(int data:row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
// 将二维数组转换成稀疏数组
// 先遍历二维数组得到非0的个数sum
int sum=0;
for(int i=0;i<11;i++) {
for(int j=0;j<11;j++) {
if(arr1[i][j]!=0) {
sum++;
}
}
}
// 创建对应的稀疏数组
int sparseArr[][]=new int [sum+1][3];
// 给稀疏数组赋值
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=sum;
// 遍历原始二维数组,将非0数据放到稀疏数组中
int count=0;
for(int i=0;i<11;i++) {
for(int j=0;j<11;j++) {
if(arr1[i][j]!=0) {
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=arr1[i][j];
}
}
}
// 输出稀疏数组
//方法一
System.out.println("稀疏数组");
for(int i=0;i<sparseArr.length;i++) {
System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
/*
方法二
for(int i=0;i<sparseArr.length;i++){
for(int j=0;j<3;j++) {
System.out.print(sparseArr[i][j]+" \t");
}
System.out.println();
}
*/
// 将稀疏数组还原成二维数组
// 定义一个新的二维数组
int arr2[][]=new int [sparseArr[0][0]][sparseArr[0][1]];
// 赋值
for(int i=1;i<sparseArr.length;i++) {
arr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
// 恢复后的遍历二维数组
System.out.println("恢复后的二维数组");
for(int[]row:arr1) {
for(int data:row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
结果: