稀疏数组

博客介绍了稀疏数组的概念及其在处理大量无效数据时的存储优势,特别是在五子棋程序中,通过将二维数组转换为稀疏数组来节省空间。详细展示了如何将二维数组转换为稀疏数组,以及如何从稀疏数组恢复到二维数组的过程,以此实现棋盘状态的存盘和续盘功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

稀疏数组

        稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组

为什么要进行压缩存储呢?

  • 原数组中存在大量的无效数据,占据了大量的存储空间,真正有用的数据却少之又少

  • 压缩存储可以节省存储空间以避免资源的不必要的浪费,在数据序列化到磁盘时,压缩存储可以提高IO效率

面临的实际需求:

在编写五子棋程序中,我们要实现一个存盘退出 和续上盘的功能。

当我们用用二维数组记录棋盘

分析问题:

      在棋盘刚开始时,二维数组大多数元素默认为0,因此记录了大量的没有意义的数据!!

      当一个数组中大部分元素为0,或者为同一个数组时,可以用稀疏数组来保存该数组。

稀疏数组的处理方法是:

①记录数组一共有几行几列,有多少个不同的值

②把具有不同值的元素的行列和值记录在一个小规模数组中(稀疏数组)从而缩小程序的规模。

二维数组和稀疏数组的相互转换

图解

Java代码实现

package sparsearray;
//稀疏数组
public class SparseArray {
    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){//外循环输出的是二维数组的一维数组row
            for (int data:row){//一维数组row循环输出对应的date
                System.out.print(data+"\t");
            }
            System.out.println();
        }
        //将二维数组转换成稀疏数组

        //①先遍历二维数组 得到非零数据的个数

        int sum = 0;
        for (int i = 0; i<11;i++)
            for (int j = 0;j<11;j++){
                if (chessArr1[i][j]!=0)
                    sum++;
            }

        //②创建对应的稀疏数组
        int spareArr[][] = new int[sum+1][3];//稀疏数组总是3列
        // 给稀疏数组赋值
        spareArr[0][0] = 11;
        spareArr[0][1] = 11;
        spareArr[0][2] = sum;
        //遍历二维数组将非零的量存放到稀疏数组
        int count = 0;//count 用于记录第几个非零数据
        for (int i = 0; i<11;i++)
            for (int j = 0;j<11;j++){
                if (chessArr1[i][j]!=0) {
                    count++;
                    spareArr[count][0]  = i;
                    spareArr[count][1] = j;
                    spareArr[count][2] = chessArr1[i][j];
                }
            }
        //输出稀疏数组的形式
        System.out.println();
        System.out.println("得到的稀疏数组为:");
        for (int i = 0;i < spareArr.length;i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(spareArr[i][j] + "\t");
            }
            System.out.println();
        }
        //稀疏数组-----> 二维数组
        /*①先读取稀疏数组的第一行,根据第一行创建二维数组
        * ②在读取稀疏数组的后几行数据,并赋值给原始的二维数组*/
        int chassArr2[][] = new int[spareArr[0][0]][spareArr[0][1]];
        for (int i =1;i< spareArr.length;i++)
            chassArr2[spareArr[i][0]][spareArr[i][1]] = spareArr[i][2];
        //输出恢复后的二维数组
        System.out.println();
        System.out.println("恢复后的二维数组:");
        for (int[]row:chessArr1){//外循环输出的是二维数组的一维数组row
            for (int data:row){//一维数组row循环输出对应的date
                System.out.print(data+"\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    

得到的稀疏数组为:
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    

Process finished with exit code 0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值