• 稀疏数组


    什么是稀疏数组?

      稀疏数组可以看作是普通数组的压缩,当普通数组只有少量有效数据时,可以使用稀疏数组的方式存储,从而达到节省空间的目的。

    为什么要用稀疏数组?

      当普通数组中只有少量有效数据时,会有大量无用数据占用空间,故可以使用稀疏数组以达到节省空间目的。

    例如:int array[][] = new int[5][5];

       array[1][1] = 1;

             array[1][2] = 2;    

            0    0    0    0    0    0
            0    1    2    0    0    0
            0    0    0    0    0    0
            0    0    0    0    0    0
            0    0    0    0    0    0

      如上定义5*5的二维数组array,只有两个有效数据1,2。其他均为默认值0,如果直接存储array,则会浪费5*5-2个空间。

    这时候就可以使用稀疏数组的方式存储,先展示使用稀疏数组存储的数据结构

            行  列  值
            5   5   2
            1   1   1
            1   2   2    

      稀疏数组有(n+1)行3列,n=有效数据个数,其中第一行固定表示原二维数组有5行5列有效值有2个。后面n行依次表示原二维数组中的有效数据分别在第几行第几列及对应值

    使用稀疏数组只保存有效数据,因此适用于原二维数组只有少量有效数据的情况,而如果原数组大部分数据为有效数据,再转为稀疏数组反而占用更多的空间(m行*n列*3)

    如何实现稀疏数组?

      1.将二维数组转为稀疏数组方法

    1.  1 public static int[][] arrayToSparseArray(int[][] array) {
       2         //统计有多少个非0数据
       3         int sum = 0;
       4         for(int i=0;i<array.length;i++){
       5             for(int j=0;j<array[i].length;j++){
       6                 if(array[i][j] != 0){
       7                     sum ++;
       8                 }
       9                 System.out.printf("%d\t",array[i][j]);
      10             }
      11             System.out.println();
      12         }
      13 
      14         System.out.println("有效数据个数="+sum);
      15 
      16         //二维数组转稀疏数组
      17         /**
      18          * 思路:1.得到二维数组的有效数据个数sum
      19          *      2.根据sum创建稀疏数组
      20          *      3.将二维数组的有效数据存入稀疏数组中
      21          */
      22         int sparseArray[][] = new int [sum+1][3];
      23         sparseArray[0][0] = array.length;
      24         sparseArray[0][1] = array[0].length;
      25         sparseArray[0][2] = sum;
      26         //遍历二维数组,并将有效数据存入稀疏数组中
      27         int count = 0;
      28         for(int i=0;i<array.length;i++){
      29             for(int j=0;j<array[i].length;j++){
      30                 if(array[i][j] != 0){
      31                     count ++;
      32                     sparseArray[count][0] = i;
      33                     sparseArray[count][1] = j;
      34                     sparseArray[count][2] = array[i][j];
      35                 }
      36             }
      37         }
      38 
      39         //打印稀疏数组
      40         for(int []row :sparseArray){
      41             for(int data: row){
      42                 System.out.printf("%d\t",data);
      43             }
      44             System.out.println();
      45         }
      46         return sparseArray;
      47     }

      调用方法

       1 public static void main(String []args){
       2         /**
       3          * 先初始化一个5*5的二维数组,包含两个值
       4          */
       5         int array[][] = new int [5][5];
       6         array[1][2] = 1;
       7         array[2][3] = 2;
       8         int[][] sparseArray = arrayToSparseArray(array);
       9 
      10     }

      调用结果:

      打印原数组
      0    0    0    0    0    
      0    1    2    0    0    
      0    0    0    0    0    
      0    0    0    0    0    
      0    0    0    0    0    
      有效数据个数=2
      打印稀疏数组
      5    5    2    
      1    1    1    
      1    2    2    

      2.将稀疏数组转为数组

       1 public static void sparseArrayToArray(int[][] sparseArray) {
       2         /**
       3          * 将稀疏数组转为二维数组
       4          * 思路:1.先取出稀疏数组的第一行,根据第一行数据,创建原始的二维数组
       5          *      2.再读取稀疏数组后几行,并赋值给原始的二维数组
       6          */
       7         int backArray[][] = new int [sparseArray[0][0]][sparseArray[0][1]];
       8 
       9         for(int i=1;i<sparseArray.length;i++){
      10             backArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
      11         }
      12 
      13         //打印原始二维数据
      14         System.out.println("稀疏数组转为二维数组后的数据:");
      15         for(int rows[] : backArray){
      16             for(int data: rows){
      17                 System.out.printf("%d\t",data);
      18             }
      19             System.out.println();
      20         }
      21     }

      调用方法

       1 public static void main(String []args){
       2         /**
       3          * 先初始化一个5*5的二维数组,包含两个值
       4          */
       5         int array[][] = new int [5][5];
       6         array[1][1] = 1;
       7         array[1][2] = 2;
       8         int[][] sparseArray = arrayToSparseArray(array);
       9 
      10         sparseArrayToArray(sparseArray);
      11     }

      调用结果

      稀疏数组转为二维数组后的数据:
      0    0    0    0    0    
      0    1    2    0    0    
      0    0    0    0    0    
      0    0    0    0    0    
      0    0    0    0    0    

    总结

      当使用普通数组,且只有少量有效数据存储在数组中时,可以将其转换为稀疏数组的方式进行存储(上述代码没有保存到文件中,后续更新),从而达到节省空间的目的。

  • 相关阅读:
    Java 开发环境配置
    kettle脚本定时任务不执行
    python 列表之队列
    tensorflow训练过程中内存溢出
    关于 numpy.array和list之间的转换
    vscode 小笔记
    【python2/3坑】从gensim的Word2Vec.load()的中文vector模型输出时显示unicode码
    WingIDE用法笔记
    numpy.ndarray类型的数组元素输出时,保留小数点后4位
    tensorboard 用法
  • 原文地址:https://www.cnblogs.com/menglong1108/p/11600812.html
Copyright © 2020-2023  润新知