稀疏数组

一、数组有与稀疏数组的含义

  array数组:一种聚合数据类型,有限个相同类型的变量所组成的有序集合,且数组中的每一个变量被称为元素。

特点:内存中顺序存储,由一个个连续的内存单元组成的,每一个内存单元都有自己的地址。因此可以很好地实现逻辑上的顺序表,数组有下标,从0开始,因此可以通过下标随机访问元素,且访问下标不能超过数组长度-1。数组中的每一个元素,都存储在小小的内存单元中,并且元素之间紧密排列,既不能打乱元素的存储顺序,也不能跳过某个存储单元进行存储。也因此,易查询,不易更新和删除。

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组保存该数组

稀疏数组( 压缩特殊的二维或多维数组 )的处理方法是:

1. 记录数组一共有几行几列,有多少个不同的值。

2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模----减少内存压力(压缩数组)

 

二、稀疏数组的使用场景

三、代码实现

    //定义一个原始二维数组
    int[][] array = new int[11][11];
    //赋值特殊值
    array[3][3] = 1;
    array[3][4] = 2;

    //输出二维数组
    for(int[] row : array) {
      for(int item : row ) {
        System.out.printf("%d ",item);
       }
      System.out.println();
    }

    //将二维数组转换为稀疏数组
    //先遍历二维数组统计特殊值---二维数组的行和列固定???
      int sum = 0 ;
      for(int i=0; i<11; i++) {
        for(int j=0;j<11; j++) {
          if( array[i][j] != 0) {
            sum++;
          }
        }
      }

    //创建特殊的稀疏数组
      int sparseArray[][] = new int[sum+1][3];
      sparseArray[0][0] = 11; //总行数
      sparseArray[0][1] = 11; //总列数
      sparseArray[0][2] = sum; //特殊值总数
    //遍历二维数组,将非0的值存放到sparseArray中
      int count = 0; //用于记录是第几个非0数
      for(int i=0;i<11;i++) {
        for(int j=0;j<11;j++) {
           if(array[i][j] != 0){
              count++;
              sparseArray[count][0]=i;
              sparseArray[count][1]=j;
              sparseArray[count][2]=array[i][j];
        }
      }
    }

      System.out.println("即将得到稀疏数组");
    //输出稀疏数组
      for(int i=0;i<sparseArray.length;i++) {
    System.out.printf("%d %d %d ",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
    }


  //稀疏数组----》二维数组
    int[][] newArray = new int[sparseArray[0][0]][sparseArray[0][1]];
      for(int i=1; i<sparseArray.length; i++) {
        newArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }
      System.out.println("即将得到恢复二维数组");
      //即将恢复二维数组
      for(int[] row : newArray ) {
          for(int it : row) {
            System.out.printf("%d ",it);
          }
        System.out.println();
        }

原文地址:https://www.cnblogs.com/Tanggula-pioneer/p/11813355.html