应用场景:
当一个数组中大部分为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
例如:
现有二维数组:
0 0 0 0
0 0 1 0
0 0 0 2
0 0 0 0
可将其化为稀疏数组保存:
4 4 2
1 2 1
2 3 2
第一行:原数组为4×4二维数组,其中有2个值不为0。
第二行 :原数组[1][2]的值为1。
第三行 :原数组[2][3]的值为2。
处理方法:
1、记录数组几行几列,有多少不同的值
2、把具有不同值的元素的行列及至记录在一个小规模的数组中,从而缩小规模的
二维数组转稀疏数组思路:
1、遍历原始数组,得到有效数据个数sum
2、根据sum就可以创建稀疏数组spareArr int[sum+1][3]
3、将sum存入稀疏数组中
稀疏转二维思路:
1、读取稀疏数组第一行,根据第一行数据创建原始数组
2、再读取稀疏数组后几行数据,赋给原始二维数组
代码:
public class SpareArray {
public static void main(String[] args) {
int chessArr1[][]=new int[4][4];
chessArr1[1][2]=1;
chessArr1[2][3]=2;
//输出原数组
for(int[] row:chessArr1){
for(int data:row){
System.out.printf("%d\t", data);
}
System.out.println();
}
//求出不为0的值的个数
int sum=0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if(chessArr1[i][j]!=0){
sum++;
}
}
}
System.out.println("sum:"+sum);
//创建稀疏数组
int sparearray[][]=new int[sum+1][3];
sparearray[0][0]=4;
sparearray[0][1]=4;
sparearray[0][2]=sum;
int cnt1=1;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if(chessArr1[i][j]!=0){
sparearray[cnt1][0]=i;
sparearray[cnt1][1]=j;
sparearray[cnt1][2]=chessArr1[i][j];
cnt1++;
}
}
}
System.out.println("得到稀疏数组:");
for (int i = 0; i < sparearray.length; i++) {
System.out.printf("%d\t%d\t%d\t\n", sparearray[i][0],sparearray[i][1],sparearray[i][2]);
}
//稀疏转二维
System.out.println("将稀疏数组转化为原二维数组");
int copychessArr[][]=new int[sparearray[0][0]][sparearray[0][1]];
for(int[] row: copychessArr){
for(int data:row){
System.out.printf("%d\t", data);
}
System.out.println();
}
for (int i = 1; i < sparearray.length; i++) {
int q=sparearray[i][0];
int p=sparearray[i][1];
int s=sparearray[i][2];
copychessArr[q][p]=s;
}
System.out.println("原二维数组:");
for(int[] row: copychessArr){
for(int data:row){
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}