乐趣区

关于java:数据结构稀疏数组

稠密数组是一种压缩过后的数组

为什么要压缩?因为在有些状况下,数组中存在大量的有效数据,如果全副保留的后会很大的影响效率,这时候就能够应用稠密数组

举例理解

五子棋一种简略的游戏,有时候咱们须要将未下完的棋进行保留,那么棋盘上必定保留了一些空的中央,在程序中咱们能够应用二维数组来实现棋盘,那么未落子的中央就是 0

代码示例

应用代码模仿棋盘(二维数组)

public static void main(String[] args) {
        // 棋盘上 0 示意 没有棋子,1 示意黑子 2 示意红子
        // 创立一个原始的二维数组,当作棋盘    
        int chessArr1[][] = new int[11][11];
        // 给棋盘上一些值
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        // 打印棋盘
        // 便当数组每一行的值赋给 row
        System.out.println("原始的二维数组");
        for(int[] row : chessArr1) {
            // 便当 row 的值 赋值给 data
            for(int data : row) {
                // 格式化打印棋盘上的数据
                System.out.printf("%d\t",data);
            }
            // 换行
            System.out.println();}
    }

上述代码模仿实现了五子棋中棋盘落子的状况,其中 1 示意 黑子,2 示意 红子,0 示意 未下子

执行后果

将二维数组转换为稠密数组

public static void main(String[] args) {
        
        // 将二维数组转换为稠密数组
        //1. 遍历 二维数组 失去非 0 数据的个数
        // 非 0 个数
        int sum = 0;
        // 遍历二维数组的行数
        for (int i = 0; i < chessArr1.length; i++) {
            // 遍历二维数组的列数
            for (int j = 0; j < chessArr1.length; j++) {
                // 值不为 0 将他的个数记录下来
                if(chessArr1[i][j] !=0 ) {sum ++ ;}
            }
        }
        System.out.println("sum ="+sum);
        // 创立稠密数组
        // 稠密数组 的 行为无效数据中个数 +1 固定时 3 列
        int sparseArr[][] = new int[sum+1][3];
        // 稠密数组 第一行第一列的数据
        sparseArr[0][0] = chessArr1.length;
        // 稠密数组 第一行第 2 列的数据
        sparseArr[0][1] = chessArr1.length;
        // 稠密数组 第一行第 3 列的数据
        sparseArr[0][2] = sum;
        // 遍历二维数组将 非 0 数据放入稠密数组
        // 计数器,用来计算 以后数第几行
        int count = 0 ;
        for (int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1.length; j++) {
                // 当二维数组中数据不为 0 时 放到稠密数组中
                if(chessArr1[i][j]!=0) {
                    count ++;
                    // 稠密数组从第二行开始 每列的数值
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[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]);
        }
        System.out.println("");

执行后果

 其中因为稠密数组的列是固定的 3 列,而且 第一行第一例的数据是二维数组的总行数,第一行第二列的数据是 二维数组的总列数,第一行 第三列的数据是二维数组中无效数据(不为 0)的总个数
从第二行起 没第一列代表该无效数据的行数,第二列代码该无效数据的列数,第三列代表该无效数据的具体的值
由此咱们能够创立并给稠密数组赋值 

将稠密数组转换为二维数组

public static void main(String[] args) {
        // 将稠密数组 转为 二维数组
        //1. 稠密数组的第一行 第一列和第二列 寄存的是 二维数组的行列 
        int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
        //2. 从第二行开始将 稠密数组中的数据赋值给 二维数组 因为都是无效数据,不必判断为 0 
        for (int i = 1; i < sparseArr.length; i++) {chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        System.out.println("复原后的二维数组");
        for(int[] row : chessArr2) {
            // 便当 row 的值 赋值给 data
            for(int data : row) {
                // 格式化打印棋盘上的数据
                System.out.printf("%d\t",data);
            }
            // 换行
            System.out.println();}
    }
 在转换回去时咱们从稠密数组的第一行第一列,第一行第二列 获取须要创立的二维数组的大小
而后从第二行开始 循环的将 第一列,第二列的 值(稠密数组的第三列)赋值给二维数组即可 

执行后果

退出移动版