前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >稀疏数组

稀疏数组

作者头像
切图仔
发布2022-09-14 16:21:43
4140
发布2022-09-14 16:21:43
举报
文章被收录于专栏:生如夏花绚烂生如夏花绚烂

先来看一个实际需求 编写的五子棋程序中,有存盘退出续上盘的功能 那么存盘退出与续上盘应该怎样实现?

可以看到棋盘是11*11的,并且棋盘上面分布了黑子和蓝子 第一种最简单的办法是将这个棋盘以二维数组的形式保存起来 1代表黑子。2代表蓝子

但是这样的做法存在一个问题 二维数组中很多值是默认值0,因此记录了很多没有意义的数据 这个时候就可以使用稀疏数组对数据进行压缩。

稀疏数组

当一个数组大部分为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组 稀疏数组的处理办法是: 1.记录数组一共有几行几列,有多少个不同的值 2.把具有不同值的元素的行列及值记录在一个小规模的数组(稀疏数组 )中,从而缩小程序的规模

如下例:将一个二维数组转换为稀疏数组

稀疏数组第一行保存的值是二维数组有多少行和列,有多少个不同的值。 在往后,每一行分别记录二维数组中每一个非0值的行列和具体值。 原先的二维数组是7*6 = 42,转换为稀疏数组后变成了13*3 = 39

注意点

1.可以看到原来的二维数组经过压缩后变成了39,似乎也没有减少多少,当然这里还好至少压缩了吧 可如果原来二维数组有13个有意义的值,那么原来的二维数组还是 7*6=42,而转换后稀疏数组则是 14*3=42,如果原来的二维数组有14、15、16、...个等有意义的值,那么稀疏数组的大小将会超过原先二维数组的大小,这里就得不偿失了。 2.如果反过来原来二维数组的有效值只有8个,那么原来的二维数组还是 7*6=42,如果转换为稀疏数组则是9*3=27,可以看到有明显的压缩了。 这里就得到两个结论: 二维数组的有效值越少,转换为对应的稀疏数组就越高效 稀疏数组适用于空数据较多的情况下 在使用稀疏数组之前一定要具体问题具体分析,不能一股脑的用!

代码实现

还是以一个五子棋盘为例

为了对棋盘进行压缩,我们将原来的二维数组的方式转换为稀疏数组的方式 稀疏数组第一行存储的是原来二维数组的行和列以及有效的数据 第二行后存储的是每一个数据的位置和具体值

思路分析 二维数组转换为稀疏数组 1.遍历原始的二维数组,得到要保存的有效数据的个数(sum) 2.根据sum就可以创建稀疏数组 sparseArr int[sum+1][3],即行=sum+1行,列永远等于3列 3.将二维数组的有效数据存入到稀疏数组即可

代码语言:javascript
复制
  public static void main(String[] args) {
        //1.创建一个原始的二维数组
        //1代表黑子,2代码蓝子
        int[][] chess = new int[11][11];
        chess[1][3] = 1;
        chess[2][4] = 2;
        System.out.println("原二维数组");
        //获取原二维数组的有效数据个数
        int sum = 0;
        for(int[] items:chess){
            for(int item :items){
                if(item!=0)sum++;
                System.out.printf("%d\t",item);
            }
            System.out.println();
        }
        //根据有效数据的个数创建稀疏数组
        int[][] sparse = new int[sum+1][3];
        //填充稀疏数组第一行数据
        sparse[0][0] = 11;
        sparse[0][1] = 11;
        sparse[0][2] = sum;

        //将原二维数组转换为稀疏数组
        int count = 0;//记录当前累计的行数
        for(int i = 0;i<11;i++){
            for(int j = 0;j<11;j++){
                if(chess[i][j]!=0){
                    count++;
                    sparse[count][0] = i; //行
                    sparse[count][1] = j; //列
                    sparse[count][2] = chess[i][j]; //值
                }

            }
        }
        System.out.println("生成后的稀疏数组");
        for(int[] items:sparse){
            for(int item :items){
                System.out.printf("%d\t",item);
            }
            System.out.println();
        }

        }



    }

稀疏数组转换为二维数组 1.先读取稀疏数组的第一行(因为第一行数据保存了原来二维数组的行列和有效数据的个数)

2.根据第一行的数据数据创建原始的二维数组 chessArr2 = int[11][11]

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

代码语言:javascript
复制
...
int[][] chess2 = new int[sparse[0][0]][sparse[0][1]];//读取稀疏数组第一行创建二维数组
        //从稀疏数组第二行开始填充原始二维数组
        for(int i = 1 ; i<sparse.length;i++){
            //           行              列              值
            chess2[sparse[i][0]][sparse[i][1]] = sparse[i][2];
        }
        //转换后的原始二维数组
        System.out.println("稀疏数组转换后的原始二维数组");
        for(int[] items:chess2){
            for(int item :items){
                System.out.printf("%d\t",item);
            }
            System.out.println();
        }

运行结果如下:

代码语言:javascript
复制
原二维数组
0    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    
生成后的稀疏数组
11    11    2    
1    3    1    
2    4    2    
稀疏数组转换后的原始二维数组
0    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    
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 稀疏数组
    • 代码实现
    相关产品与服务
    文件存储
    文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档