稀疏数组
背景
如下图所示,一个11*11的棋盘上只有两个棋子,其余地方皆为空,在存储时,会造成很大的空间浪费。
普通数组保存
采用一个11*11的二维数组存储
稀疏数组保存
一个(不为空的个数+1)行3列的二维数组,第一行存储普通数组的行列以及不为空的个数,第二行以及之后的保存不为空的行坐标、列坐标以及具体的值。
代码实现
public class Demo01 {
public static void main(String[] args) {
int[][] arrys=new int[11][11]; //arrys表示普通二维数组
arrys[1][2]=1;
arrys[2][3]=2;
print(arrys);
//二维数组转为稀疏数组
int sum=0; //sum表示二维数组中不为空的个数
for (int i = 0; i < arrys.length; i++) {
for (int j = 0; j < arrys[i].length; j++) {
if(arrys[i][j]!=0)
sum++;
}
}
int [][] arrys2=new int[sum+1][3]; //arrys2表示稀疏数组
arrys2[0][0]=arrys.length;
arrys2[0][1]=arrys[1].length;
arrys2[0][2]=sum;
sum=1;//sum=1表示在普通数组中第1个不为空的数应该在稀疏数组的第arrys[1]行,依次类推
for (int i = 0; i < arrys.length; i++) {
for (int j = 0; j < arrys[i].length; j++) {
if(arrys[i][j]!=0){
arrys2[sum][0]=i;
arrys2[sum][1]=j;
arrys2[sum][2]=arrys[i][j];
sum++;
}
}
}
print(arrys2);
//稀疏数组转为二维数组
int[][] arrys3=new int[arrys2[0][0]][arrys2[0][1]];
for (int i = 1; i < arrys2.length; i++) {
arrys3[arrys2[i][0]][arrys2[i][1]]=arrys2[i][2];
}
print(arrys3);
}
//打印输出
public static void print(int [][]arrys){
for (int i = 0; i < arrys.length; i++) {
for (int j = 0; j < arrys[i].length; j++) {
System.out.print(arrys[i][j]+" ");
}
System.out.println();
}
}
}