初识松散数组

本文介绍如何通过将密集的二维数组转换为稀疏的松散数组形式,以减少存储空间。作者详细展示了如何计算不同值的数量,存储行数、列数和值的分布,并演示了如何压缩和还原过程。

稀疏数组和二维数组转换

分析问题

在二维数组的很多值的默认值为0,空值,因此也记录了很多没有意义的数据,因此需要做一些优化,减少存储空间

概念

  • 记录数组一共有几行几列,有多少个不同的值。
  • 把具有不同值的元素及值记录在一个小规模的数组中,从而缩小程序的规模

直接上代码:

// 手动的创建一个二维数组
        int[][] ints = new int[10][10];
        ints[0][3] = 5;
        ints[2][5] = 23;
        ints[7][1] = 8;
        ints[4][7] = 12;
        ints[6][9] = 11;
        ints[9][9] = 15;
        ints[8][2] = 17;
// 尝试打印数组的结构
        for (int[] anInt : ints) {
            for (int i : anInt) {
                System.out.print("\t" + i);
            }
            System.out.println();
        }

        System.out.println();
// 初始化松散数组; 松散数组有一行记录着普通二维数组的行数和列数及值的个数,在初始化松散数组的时候需要多初始化一行
        int row = 0;
        int column = 0;
        int value = 0;
        for (int[] anInt : ints) {
            for (int i : anInt) {
                column++;
                if (i != 0) {
                    value++;
                }
            }
            row ++;
        }
        // 行数应该由多少个值确定的,而不是一开始就初始化完成,因为在初始化时并不知道有多少值,需要多少行,最小1行(初始化松散数组的第一行),最大100行(二维数组每个坐标上都有值)
        int[][] looses = new int[c+1][3];
        looses[0][0] = row;
 // 双for循环需要取模,得到列的行数
        looses[0][1] = column / row;
        looses[0][2] = value;
// 查看初始化的松散数组结构
        for (int[] loose : looses) {
            for (int i : loose) {
                System.out.print("\t" + i);
            }
            System.out.println();
        }

 // 把二维数组的数据放入松散数组
        int count = 0;
        for (int i = 0; i < ints.length; i++) {
            for (int j = 0; j < ints[i].length; j++) {
                if (ints[i][j] != 0) {
                    // 这不能以外循环的 i 值作为索引累加,否则会有空行出现;达不到压缩的目的了; 松散数组索引为 0 的行是二维数组的参数信息,所有放入值需要从索引为1开始
                    looses[count+1][0] = i;
                    looses[count+1][1] = j;
                    looses[count+1][2] = ints[i][j];
                    count++;
                }
            }
        }

        System.out.println("放入数据的松散数组结构");
        for (int[] loose : looses) {
            for (int i : loose) {
                System.out.print("\t" + i);
            }
            System.out.println();
        }

        System.out.println("把松散数组还原成普通的二维数组");
        final int[][] newInts = new int[looses[0][0]][looses[0][1]];
        // 索引为0时,记录着普通二维数组的行数列数;循环从
        for (int i = 1; i < looses.length; i++) {
            for (int j = 0; j < looses[i].length; j++) {
                // 这儿不应该判断松散数组索引为 2 的值为不为零, 假如存放的值就为0,或者为null,就有问题
                newInts[looses[i][0]][looses[i][1]] = looses[i][2];
            }
        }

        System.out.println("成功还原成普通的二维数组");
        for (int[] newInt : newInts) {
            for (int i : newInt) {
                System.out.print("\t" + i);
            }
            System.out.println();
        }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值