
01_概念

02_使用场景

03_压缩步骤

04_Java实现

05_Java实现(稠密数组压缩成稀疏数组、稀疏数组解压成稀疏数组)
package DataStructureReview;
public class SparseArrayDemo {
public static void main(String[] args) {
//准备一个9*9的数组
int[][] arr = new int[4][4];
arr[0] = new int[]{1, 0, 0, 0, 0, 0, 0};
arr[1] = new int[]{0, 2, 0, 0, 88, 0, 0};
arr[2] = new int[]{0, 0, 3, 0, 0, 0, 0};
arr[3] = new int[]{0, 0, 0, 4, 0, 0, 9};
int[][] sparse = UtilityClass.dense2sparse(arr);
UtilityClass.printArray(sparse);
System.out.println("=========================");
UtilityClass.printArray(UtilityClass.sparse2dense(sparse));
}
}
class UtilityClass {
//将稠密数组压缩成稀疏数组,默认无效数据为0
public static int[][] dense2sparse(int[][] arr) {
//1.判断是否为有效压缩
int rowNum = arr.length;
int colNum = arr[0].length;
int num = 0;
for (int i = 0; i < rowNum; i++) {
for (int i1 = 0; i1 < colNum; i1++) {
if (arr[i][i1] != 0) {
num++;
}
}
}
if ((rowNum * colNum / 3 - 1) < num) {
throw new RuntimeException("压缩无效,无法进行压缩");
}
//2.将稠密数组压缩成稀疏数组
int[][] spaArr = new int[num + 1][3];
spaArr[0] = new int[]{rowNum, colNum, num};
int cur = 1;
for (int i = 0; i < rowNum; i++) {
for (int i1 = 0; i1 < colNum; i1++) {
if (arr[i][i1] != 0) {
spaArr[cur][0] = i;
spaArr[cur][1] = i1;
spaArr[cur][2] = arr[i][i1];
cur++;
}
}
}
return spaArr;
}
//打印2维数组
public static void printArray(int[][] arr) {
int rowNum = arr.length;
int colNum = arr[0].length;
for (int i = 0; i < rowNum; i++) {
for (int i1 = 0; i1 < colNum; i1++) {
System.out.printf("%d ", arr[i][i1]);
}
System.out.println();
}
}
//将稀疏数组还原成稠密数组
public static int[][] sparse2dense(int[][] arr) {
int row_num = arr[0][0];
int clo_num = arr[0][1];
int[][] dense_arr = new int[row_num][clo_num];
int rowNum = arr.length;
int colNum = arr[0].length;
for (int i = 1; i < rowNum; i++) {
int row = arr[i][0];
int col = arr[i][1];
int value = arr[i][2];
dense_arr[row][col] = value;
}
return dense_arr;
}
}