稀疏数组和二维数组转换
分析问题
在二维数组的很多值的默认值为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();
}
本文介绍如何通过将密集的二维数组转换为稀疏的松散数组形式,以减少存储空间。作者详细展示了如何计算不同值的数量,存储行数、列数和值的分布,并演示了如何压缩和还原过程。
721

被折叠的 条评论
为什么被折叠?



