稀疏数组(Sparse Array)是一种用于压缩存储大量零值或相同值元素的二维数组的技术。稀疏数组通过记录非零元素及其位置来减少内存占用。
包括从普通二维数组到稀疏数组的转换、稀疏数组到普通二维数组的还原。
实现稀疏数组的步骤
- 创建原始二维数组并初始化部分元素。
- 将二维数组转换为稀疏数组。
- 将稀疏数组还原为二维数组。
public class SparseArrayExample {
// 打印二维数组
public static void print2DArray(int[][] array) {
for (int[] row : array) {
for (int element : row) {
System.out.printf("%d\t", element);
}
System.out.println();
}
}
// 将二维数组转换为稀疏数组
public static int[][] toSparseArray(int[][] original) {
// 统计非零元素的数量
int nonZeroCount = 0;
for (int[] row : original) {
for (int element : row) {
if (element != 0) {
nonZeroCount++;
}
}
}
// 创建稀疏数组
int[][] sparseArray = new int[nonZeroCount + 1][3];
sparseArray[0][0] = original.length;
sparseArray[0][1] = original[0].length;
sparseArray[0][2] = nonZeroCount;
// 填充稀疏数组
int count = 0;
for (int i = 0; i < original.length; i++) {
for (int j = 0; j < original[i].length; j++) {
if (original[i][j] != 0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = original[i][j];
}
}
}
return sparseArray;
}
// 将稀疏数组还原为二维数组
public static int[][] fromSparseArray(int[][] sparseArray) {
int rows = sparseArray[0][0];
int cols = sparseArray[0][1];
int[][] restoredArray = new int[rows][cols];
// 填充二维数组
for (int i = 1; i <= sparseArray[0][2]; i++) {
int row = sparseArray[i][0];
int col = sparseArray[i][1];
int value = sparseArray[i][2];
restoredArray[row][col] = value;
}
return restoredArray;
}
public static void main(String[] args) {
// 创建一个 5x5 的二维数组
int[][] originalArray = new int[5][5];
originalArray[1][2] = 1;
originalArray[2][3] = 2;
originalArray[4][4] = 3;
System.out.println("Original 2D array:");
print2DArray(originalArray);
// 转换为稀疏数组
int[][] sparseArray = toSparseArray(originalArray);
System.out.println("\nSparse array:");
print2DArray(sparseArray);
// 还原为二维数组
int[][] restoredArray = fromSparseArray(sparseArray);
System.out.println("\nRestored 2D array:");
print2DArray(restoredArray);
}
}
测试输出
运行程序,输出结果如下:
Original 2D array:
0 0 0 0 0
0 0 1 0 0
0 0 0 2 0
0 0 0 0 0
0 0 0 0 3
Sparse array:
5 5 3
1 2 1
2 3 2
4 4 3
Restored 2D array:
0 0 0 0 0
0 0 1 0 0
0 0 0 2 0
0 0 0 0 0
0 0 0 0 3