数据结构_02稀疏数组

稀疏数组

  1. 引入:在棋盘游戏中经常会遇到,保留此局或者复盘,此时我们一般会使用一个二维数组将棋盘的信息存储起来,但是针对那些二维数组中含很多0(无意义)的情况就需要使用,稀疏数组压缩
  2. 当一个数组大部分元素为0,或同一个值时,就可使用稀疏数组
    在这里插入图片描述
    问题:这种真的有用吗,以上图为例,77=49 降到 38=24,但如果有效值再多一倍那它的压缩就完全不存在了,这时有效值也只占16/49,大概1/3,这里就涉及到有效值占的比例了
  3. 二维数组转sparseArray思路:
    1. 遍历二维数组,找到有效数据的个数sum
    2. 根据sun创建sparseArray,int[sum+1][3]//+1是因为第一行的三个值分别为原始二维数组的行数,列数,有效值个数
    3. 将二维数组的每个有效值依次填入sparseArray
    4.
  4. sparseArray转二维数组
    1. 根据sparseArray的第一行创建二维数组 int[sparseArray[0][0]][sparseArray[0][1]]
    2. 再将每个值导入到二维数组的对应位置
  5.  public class sparseArray {
         public static void main(String[] args) {
             int[][] doubleArr= new int[11][11];
             for (int i = 0; i < 11; i++) {//for循环快捷键 fori
                 for (int j = 0; j <11 ; j++) {
                     doubleArr[i][j]=0;
                 }
             }
             doubleArr[1][2]=1;
             doubleArr[2][3]=2;
             doubleArr[2][4]=2;
             doubleArr[2][7]=2;
             for (int i = 0; i <11 ; i++) {
                 for (int j = 0; j < 11; j++) {
                     System.out.printf( doubleArr[i][j]+"\t");
                 }
                 System.out.println();
             }
         
         //二维数组转为sparseArr
         int sum=0;
         for (int i = 0; i <11 ; i++) {
             for (int j = 0; j < 11; j++) {
                 if(doubleArr[i][j]!=0){
                     sum++;
                 }
             }
             
         }
         int[][] sArr = new int[sum+1][3];
         sArr[0][0] = 11;
         sArr[0][1] = 11;
         sArr[0][2] = sum;
    
         int start=1;
         for (int i = 0; i <11; i++) {
             for (int j = 0; j < 11; j++) {
                 if(doubleArr[i][j] != 0){
    
                     sArr[start][0]=i;
                     sArr[start][1]=j;
                     sArr[start][2]=doubleArr[i][j];
                     start++;
                 }
    
             }
         }
         for (int i = 0; i <sum+1; i++) {
             for (int j = 0; j <3; j++) {
                 System.out.print(sArr[i][j]+"\t");
             }
             System.out.println();
         }
     }
    
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值