二维数组的压缩存储,稀疏数组

简介: 在二维数组只有少部分有效数据的时候,为了不存储过多的无效数据,我们可以使用稀疏数组来存储二维数组。

在二维数组只有少部分有效数据的时候,为了不存储过多的无效数据,我们可以使用稀疏数组来存储二维数组。


下面是一个五子棋的残局,用二维数组表示之后,会发现有很多0的无效数据,这个时候就可以使用稀疏数组保存二维数组。




从一个11*11的数组压缩成3*3的稀疏数组,节省了内存开支。


稀疏数组是一个列数固定行数为二维数组中有效数据的个数+1


第一行第一列是二维数组的行数


第一行第二列是二维数组的列数


第一行第三列是二维数组中有效数据的个数


第二行第一列是第一个有效数据在二维数组中的行


第二行第二列是第一个有效数据在二维数组中的列


第二行第三列是第一个有效数据的值


第三行第一列是第二个有效数据在二维数组中的行


第三行第二列是第二个有效数据在二维数组中的列


第三行第三列是第二个有效数据的值


……



二维数组转稀疏数组的思路


1,遍历原始二维数组,得到有效数据的个数 sum


2,根据sum就可以创建稀疏数组int[][] sparseArr = new int[sum+1][3];


3,将二维数组的有效数据存入稀疏数组


稀疏数组转原始二维数组的思路


1,先读取稀疏数组的第一行,根据第一行的数据,创建原始二维数组,比如上面的int[][] chessArr = new int[11][11];


2,再读取稀疏数组后几行的数据,并赋给原始的二维数组即可


代码实现:


public static void main(String[] args) {
        //创建一个二维数组 11*11
        //0:表示没有棋子,1:表示黑子 ,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.print(data+"\t");
            }
            System.out.println();
        }
        //1,遍历二维数组,得到有效数据的个数
        int sum = 0;
        for (int i = 0;i<chessArr1.length;i++){
            for (int j = 0;j<chessArr1[0].length;j++){
                if(chessArr1[i][j] != 0){
                    sum++;
                }
            }
        }
        //2,创建对应的稀疏数组
        int[][] sparseArr = new int[sum + 1][3];
        //给稀疏数组赋值
        sparseArr[0][0] = chessArr1.length;
        sparseArr[0][1] = chessArr1[0].length;
        sparseArr[0][2] = sum;
        //遍历二维数组,将非零的值存放到sparseArr中
        int count = 0;
        for (int i = 0;i<chessArr1.length;i++){
            for (int j = 0;j<chessArr1[0].length;j++){
                if(chessArr1[i][j] != 0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                }
            }
        }
        //3,输出得到的稀疏数组
        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]);
        }
        //4,将稀疏数组恢复成二维数组
        //根据稀疏数组第一行的数据创建二维数组
        int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
        //读取稀疏数组的后几行数据,从第二行开始,并赋给原始数组
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        System.out.println("恢复后的二维数组");
        for (int[] row : chessArr1){
            for (int data : row){
                System.out.print(data+"\t");
            }
            System.out.println();
        }
    }

执行结果:

相关文章
|
10月前
【稀疏数组】
【稀疏数组】
19 0
|
9月前
|
算法 容器
算法:双指针解决数组划分和数组分块问题
算法:双指针解决数组划分和数组分块问题
|
12月前
|
存储 算法 编译器
学C的第十二天【深入了解数组:一维和二维数组的创建和初始化;一维和二维数组的使用;一维和二维数组在内存中的存储;数组越界;数组作为函数参数;冒泡排序(对数组名的理解)】-2
5.二维数组的使用 操作符 [ ] :下标引用操作符,它其实就是数组访问的操作符,使用两个[ ],访问行和列 二维数组的行和列都是从0开始的
|
10月前
|
存储 NoSQL
第3章 数组与矩阵——3.5 稀疏矩阵
第3章 数组与矩阵——3.5 稀疏矩阵
|
10月前
|
Java C# C++
C#中的多维数组和交错数组
C#中有多维数组和交错数组,两者有什么区别呢! 直白些,多维数组每一行都是固定的,交错数组的每一行可以有不同的大小。 以二维的举例,二维数组就是m×n的矩阵,m行n列;而交错数组(又叫锯齿数组)有m行,但是每一行不一定是n列。Got it? 在这个意义上,C++和Java中的多维数组起始相当于C#中的交错数组,要使用多维数组,只需要保证每个维度的长度是相等的就OK了! 因为m×n的矩阵这样的多维数组比较常用,感觉C#中对两个进行了区分,提供了一些便利!
50 0
|
Java 定位技术
减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现
减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现
99 1
减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现
|
人工智能 Java 算法框架/工具
二维前缀和数组&二维差分数组
二维差分数组div中的每一个格子记录的是「以当前位置为区域的左上角(区域右下角恒定为原数组的右下角)的值的变化量」【应该不固定 可以倒转】
302 0
二维前缀和数组&二维差分数组
|
存储
数据结构— 数组、特殊矩阵、稀疏矩阵(一)
数据结构— 数组、特殊矩阵、稀疏矩阵
104 0
数据结构— 数组、特殊矩阵、稀疏矩阵(一)