Java稀疏数组


稀疏数组的含义

Java实现代码

    public static void main(String[] args) {
        int[][] arrays1=new int[11][11];
        arrays1[1][2]=1;
        arrays1[2][3]=2;
        System.out.println("输出原始数组为:");
        //System.out.println(Arrays.deepToString(arrays1));Java提供的二维数组打印方法只能一行输出
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                System.out.print(arrays1[i][j]+"\t");
            }
            System.out.println();
        }
        //下方c-foreach循环复杂度也差不多
        /*for (int[] ints : arrays1) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }*/
        int sum=0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (arrays1[i][j] != 0) {
                    sum++;
                }
            }
        }
        System.out.println("二维数组有效元素个数为:"+sum);
        System.out.println("============创建过程(压缩)============");
        //正式创建一个稀疏数组(牺牲时间换取空间的压缩方法)
        //本质上是将一个正常数组的非零元素保留o元素舍去的一种压缩算法
        int[][] arrays2 = new int [sum+1][3];
        //稀疏数组的每一行代表着有效元素所在源数组的:行,列,值信息(此处的sum+1是因为下方第一行要存放稀疏数组的特征信息)
        arrays2[0][0] = arrays1.length;
        arrays2[0][1] = arrays1[0].length;
        arrays2[0][2] = sum;
        //第一行记录了源数组的行,列,有效元素个数信息
        int count = 0;
        for (int i = 0; i < arrays1.length; i++) {//行
            for (int j = 0; j < arrays1[i].length; j++) {//列
                if (arrays1[i][j] != 0) {
                    count++;//[0][0]存放了arrays1这个二维数组的特征信息(11行11列2个有效元素)
                    arrays2[count][0] = i;//记录行
                    arrays2[count][1] = j;//记录列
                    arrays2[count][2] =arrays1[i][j];//记录有效元素
                }
            }
        }
        System.out.println("稀疏数组:");
        for (int i = 0; i < arrays2.length; i++) {
            System.out.println(arrays2[i][0]+"\t"+arrays2[i][1]+"\t"+arrays2[i][2]+"\t");
        }
        System.out.println("============还原过程(解压缩)============");
        int[][] arrays3 =new int[arrays2[0][0]][arrays2[0][1]];//取回特征值(源数组行列信息)
        for (int i = 1; i < arrays2.length; i++) {//此处i=0存放的是源数组的特征信息不必读取,应从i=1读起
            arrays3[arrays2[i][0]][arrays2[i][1]]=arrays2[i][2];
        }
        for (int[] ints : arrays3) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }

输出结果

输出原始数组为:
0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	2	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
二维数组有效元素个数为:2
============创建过程(压缩)============
稀疏数组:
11	11	2	
1	2	1	
2	3	2	
============还原过程(解压缩)============
0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	2	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	

进程已结束,退出代码0