数据结构 一 (稀疏数组)

稀疏数组

思想 :

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

一个正常的二维数组转换为稀疏数组

                           

 

稀疏数组只有三列分别表示 行 列  数值  , 行数取决于不同数值的个数     ,第一行保存的是二维数组的 行 列 和不同值的总数

实现二维转稀疏:

首先需要遍历非 0值的总数,二维数组长度已知

二次遍历数组保证不同 值的 行 列  值

还原二维就很简单了只需要读取 第一行信息 创建 二维数组,在一 一遍历稀疏数组还原对应坐标的值就可以

模拟实现 棋盘棋子的保存  

 

代码实现二维数组转稀疏数组:

public class SparseArray {
     public static void main(String[] args) {
         //创建一个原始的二维数据11*11
         // 0 表示没有棋子,1 表示 黑子,2 表示白子
         int chessArray[][] = new int[11][11];
         chessArray[1][2] =  1;
         chessArray[2][4]  = 2;
         // 输出查看
         for ( int[] row : chessArray){
             for (int data : row){
                 System.out.printf("%d\t",data);
             }
             System.out.println();
         }
         // 二维数组 转  稀疏数组
         // 记录非 0 值的地址 和个数
         int sum = 0;
         for(int i = 0 ;i< 11;i++){
             for ( int j = 0 ; j<11; j++){
                 if(chessArray[i][j] != 0){
                     sum++;
                 }
             }
         }
         System.out.println(sum);
         // 创建对应的稀疏数组
         int spareArr[][] = new int[sum+1][3];
         // 稀疏数组第一行记录整个数组的行列 以及不同值的数量
         //剩下每一行都 记录了每一个值的行列位置 和值
         spareArr[0][0] = 11;
         spareArr[0][1] = 11;
         spareArr[0][2] = sum;
         // 遍历位置
          int count =0;
         for(int i = 0 ;i< 11;i++){
             for ( int j = 0 ; j<11; j++){
                 if(chessArray[i][j] != 0){
                     count++;
                     spareArr[count][0] = i ;
                     spareArr[count][1] = j ;
                     spareArr[count][2] =chessArray[i][j] ;
                 }
             }
         }
         //输出稀疏数组
         System.out.println();
         System.out.println("得到的稀疏数组");
         for (int i =0;i<3;i++){
             System.out.printf("%d\t%d\t%d\t\n",spareArr[i][0] ,spareArr[i][1],spareArr[i][2]) ;
         }
         // 稀疏还原二维
          int Back[][] = new int [spareArr[0][0]][spareArr[0][1]];
         for (int i =1 ; i<spareArr.length;i++){
             Back[spareArr[i][0]][spareArr[i][1]] = spareArr[i][2];
         }
          System.out.println("恢复二维数组");
          for (int[] row : Back){
              for (int data : row){
                  System.out.printf("%d\t", data);
              }
              System.out.println();
          }
     }


 }

 

          

稀疏数组的应用场景

  • 用于压缩数据
  • 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)。
  • 把稀疏数组存盘,并且可以从新恢复原来的二维数组数。

          

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值