稀疏数组

1.为什么要用稀疏数组?

面对于含有大量相同数据的数组,可以通过稀疏数组的形式来压缩数组.

  • 原数组中存在大量的无效数据,占据了大量的存储空间,真正有用的数据却少之又少
  • 压缩存储可以节省存储空间以避免资源的不必要的浪费,在数据序列化到磁盘时,压缩存储可以提高IO效率

原数组

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

稀疏数组形式

          11 11 2
          1  2  1
          2  4  2

arr[0] [0] 表示原来的数据总行数 arr[0] [1] 表示总列数 arr[0] [2] 表示有效数据总个数

arr[1] [0] 表示第一个有效数据所在的行数

arr[1] [1] 表示第一个有效数据所在的列数

arr[1] [2] 表示第一个有效数据的值

下面的以此类推


也就是说稀疏数组的第一行表示原数组的大小 和有效数据的个数其他的表示有效数据所在的位置和值

2.代码实现

2.1.创建稀疏数组并写入数据
//1.首先得到原数组的有效数据的个数
int sum = 0;
for (int[] rows : FirstArray) {
    for (int row : rows) {
        if (row != 0) {
            sum++;
        }
    }
}
//2.1创建稀疏数组
  int spareArray[][] = new int[sum + 1][3];
        spareArray[0][0] = 5;
        spareArray[0][1] = 5;
        spareArray[0][2] = sum;

//2.2把有效数据写进去
    int count = 1;
    for (int i = 0; i < 5; i++) {
         for (int j = 0; j < 5; j++) {
             if (FirstArray[i][j] != 0) {
                 spareArray[count][0] = i;
                 spareArray[count][1] = j;
                 spareArray[count][2] = FirstArray[i][j];
                 count++;
               }
           }
       }
2.2将稀疏数组写入磁盘文件中
/*
 * @Author: yxc
 * @date: 2020/2/23 15:10
 * @Description 稀疏数组写进磁盘文件
 * @parm [sparseArray]
 * @return void
 */
public static void sparseArrayOutput(int[][] sparseArray) throws Exception {

    FileOutputStream fos = new FileOutputStream("F:\\IDEAWorkSpace\\JavaStudy\\src\\AMyself\\SparseArrayDemo.txt");
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    for (int i = 0; i < sparseArray.length; i++) {
        for (int j = 0; j < 3; j++) {
            String content = String.valueOf(sparseArray[i][j]);
            bos.write(content.getBytes(), 0, content.getBytes().length);
        }
    }
    bos.flush();
    bos.close();
}
2.3 接下来从磁盘中读取稀疏数组
/*
 * @Author: yxc
 * @date: 2020/2/23 16:22
 * @Description 把稀疏数组从磁盘文件中读取出来
 * @parm []
 * @return int[][]
 */
public static int[][] sparseArrayIntput() throws Exception {
    FileInputStream fis = new FileInputStream("F:\\IDEAWorkSpace\\JavaStudy\\src\\AMyself\\SparseArrayDemo.txt");
    byte[] buffer = new byte[10240];
    int flag = 0;
    int[][] sparseArray = new int[3][3];
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            //单个读取
            if (flag != -1) {
                flag = fis.read();
                int data = Integer.parseInt(String.valueOf((char) flag));
                sparseArray[i][j] = data;
            }
        }
    }
    return sparseArray;
}
2.4 将读取到的稀疏数组还原
	 try {
        //接收读取到的稀疏数组
        int[][] sparseArrayIntput;
        sparseArrayIntput = sparseArrayIntput();
        //查看读取出来的数组
        //openF(sparseArrayIntput);
        //5.还原出原数组
        int chessArr2[][] = new int[sparseArrayIntput[0][0]][sparseArrayIntput[0][1]];
        for (int i = 1; i < sparseArrayIntput.length; i++) {
            chessArr2[sparseArrayIntput[i][0]][sparseArrayIntput[i][1]] = sparseArrayIntput[i][2];
        }
        openF(chessArr2);

    } catch (Exception e) {
        e.printStackTrace();
    }

}

### 3.效果截图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SAUVbKPs-1582894062795)(https://raw.githubusercontent.com/yuanxuanchao/clouding/master/img/稀疏数组.png)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值