茶娱饭后(四)之稀疏数组

概念:

所谓稀疏数组就是当数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以使用稀疏数组去压缩数据

主要就是为了节省那些为零的值初始化了不用的内存,我们在来看一个图

可以很明显的可以看到里面有很多空(0)值,这些值实际上是没有用到的

哪买稀疏数组长什么样呢,我们在来看个图:

从这个图我们大概可以看出一个大概意思,二维数组(从原来的6行7列,变成了9行,3列)不过不要急,下面有详细的代码实践帮助理解,

 

   
        // 1表示黑子,2 表示蓝子 0 表示空值
        int[][] charArr = new int[11][11];

        /*模拟二维黑白子的二维数组如下*/

        charArr[1][2]=1;
        charArr[2][3]=2;
        charArr[4][5]=2;

        System.out.println("原始测试二维数组如下:");

        //输出原始的二维数组
        for(int [] row : charArr){
            for (int data : row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

        System.out.println();

        int sum = 0 ;
        //二维数组转稀疏数组
        for(int i = 0 ; i < 11 ; i ++){
             for(int j = 0 ; j < 11 ; j ++){
                  if (charArr[i][j] != 0){
                      sum++;
                  }
             }
        }
        System.out.printf("原始数组有效元素sum=%d\n",sum);
        System.out.println();
        System.out.println("转换后的稀疏数组如下:");



        //创建稀疏数组
        int[][] charArr1 = new int[sum + 1][3];
        charArr1[0][0] =11; // 行
        charArr1[0][1] =11; // 列
        charArr1[0][2] =sum; // 值

        //二维数组转稀疏数组
        int count = 0;
        for(int i = 0 ; i < 11 ; i ++){
            for(int j = 0 ; j < 11 ; j ++){
                if (charArr[i][j] != 0){
                     count++;
                     charArr1[count][0] = i;//行
                     charArr1[count][1] = j; // 列
                     charArr1[count][2] = charArr[i][j];
                }
            }
        }

      //得到的稀疏数组形式
      for(int i = 0 ; i < charArr1.length ; i ++ ){
        System.out.printf("%d\t%d\t%d\t\n",charArr1[i][0],charArr1[i][1],charArr1[i][2]);
      }
      System.out.println();
      System.out.println("还原的二维数组如下:");
      // 将稀疏数组转二维数组
        int[][] charArr2 = new int[charArr1[0][0]][charArr1[0][1]];//第一行数据保存的数组大小初始化要转的二维数组

        // 读取稀疏数组的后几行数据赋值给稀疏数组(从第二行开始)
        for(int i = 1; i < charArr1.length ; i ++ ){//开始读取每行内容
            charArr2[charArr1[i][0]/*初始化行*/][charArr1[i][1]/*初始化列*/]=charArr1[i][2]/*初始化值*/;//稀疏数组的行,列,值都对应二维数组中的行列值
        }

        //恢复后的二维数组
        for(int [] row : charArr2){
            for (int data : row){/*打印二维数组的每一列数据*/
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

运行结果如下:

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值