稀疏数组
若一个数组中,除了个别数值之外的其他数值大小相等,就可以将该数组转换为稀疏数组,这可以大大的压缩数组的大小。
1.
Arr为8×8的二维矩阵,其中绝大部分的值为0;仅
Arr[1][2]=1
Arr[2][3]=2
2.
sparseArr为压缩后的矩阵,其中
sparseArr[0][0]记录了Arr的行数信息
sparseArr[0][1]记录了Arr的列数信息
sparseArr[0][2]记录了Arr不为0的值的个数
3.
sparseAtr除第一行外,后面每行记录了不为0的值的位置与大小
可以看出原始的8×8的矩阵被压缩为3×3
代码实现
数组压缩
public class sparseArr {
public static void main(String[] args) {
// 创建数据,大小为8*8
int[][] arr = new int[8][8];
// 不为0的值的大小与位置
arr[1][2] = 1;
arr[2][3] = 2;
// 遍历数组,使用foreach方法
for (int[] row : arr) {
for (int value : row) {
System.out.printf("%d\t", value);
}
System.out.println();
}
System.out.println();
// 遍历原始数组,记录不为0的元素的个数
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j ++) {
if (arr[i][j] != 0) {
count++;
}
}
}
// System.out.println(count);
// System.out.println();
// 创建新数组,用于压缩原始数组
int[][] sparseArr = new int[count + 1][3];
sparseArr[0][0] = 8;
sparseArr[0][1] = 8;
sparseArr[0][2] = count;
// 将不为0的原始数组数值填入压缩后的数组
int k = 1;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j ++) {
if (arr[i][j] != 0){
sparseArr[k][0] = i;
sparseArr[k][1] = j;
sparseArr[k][2] = arr[i][j];
k ++;
}
}
}
// 遍历压缩后的数组
for (int i = 0; i < sparseArr.length; i++) {
for (int j = 0; j < sparseArr[0].length; j++) {
System.out.printf("%d\t", sparseArr[i][j]);
}
System.out.println();
}
System.out.println();
}
}
数组还原
int[][] newArr = new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 0; i < sparseArr[0][2]; i++) {
newArr[sparseArr[i + 1][0]][sparseArr[i + 1][1]] = sparseArr[i + 1][2];
}
for (int[] row : newArr) {
for (int value : row) {
System.out.printf("%d\t", value);
}
System.out.println();
}