一.稀疏数组

1.定义:稀疏数组可以看作普通数组的压缩,最好是无效数据远远大于有效数据量的数组

例如:下面是一个11*11的二维数组,有效数据为1和2

 稀疏数组_数组

 

将它转为稀疏数组:

稀疏数组_二维数组_02

 

 第一行的含义为:11行,11列,有效数据为2

第二行的含义:在第二行,第三列的有效数据为1

第三行含义:在第三行,第五列的有效数据为2

 

2.代码实现

 

int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        //输出原始二维数组
        System.out.println("原始的二维数组");
        for (int[] row : chessArr1) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

//将二维数组转为稀疏数组
//1.先遍历二维数组得到有效数据个数
int sum=0;
for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1.length; j++) {
                if (chessArr1[i][j] != 0) {
                    sum++;
                }
            }
        }

//2.创建对应的稀疏数组
int sparesArr[] []=new int[sum+1][3];
//给稀疏数组赋值
sparesArr[0][0] = 11;
sparesArr[0][1] = 11;
sparesArr[0][2] = sum;

//遍历二维数组,将非0的值放到稀疏数组中
int count=0;
for(int i=0;i<Arr1.length;i++){
    for(int j=0;j<Arr1.length;j++){
        if(Arr1[i][j]!=0){
          count++;
          sparesArr[count][0] = i;
          sparesArr[count][1] = j;
          sparesArr[count][2] = chessArr1[i][j];
}
}
}

//遍历稀疏数组
System.out.println("得到的稀疏数组为");
 for (int i = 0; i < sparesArr.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n", sparesArr[i][0], sparesArr[i][1], sparesArr[i][2]);
        }
 System.out.println();

 

 

3.将稀疏数组转成二维数组

int Arr2[][]=new int[sparesArr[0][0]][sparesArr[0][1]];
for(int i=0;i<sparesArr.length;i++){
    Arr2[sparesArr[i][0]][sparesArr[i][1]]=sparesArr[i][2];
}

//输出恢复后的二维数组
for(int [] row:Arr2){
 for(int data:row){
    System.out.printf("%d\t", data);
}
System.out.println();
}