目录
1. 稀释数组
1.1 稀释数组的介绍
- 1. 稀释数组
- 1.1 稀释数组的介绍
- 1.1 稀释数组的处理方法
- 1.3 稀疏数组的转换步骤和代码实现
有时一个二维数组很多值都是0或同一个值,可以考虑使用稀释数组来保存数据
1.1 稀释数组的处理方法- 记录数组一共有几行几列,有多少个不同的值(除去0或同一个值)
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
如下图所示,将一个二维数组,用稀释数组来表示
二维数组转稀疏数组的步骤:
- 遍历原始的二维数组,得到原始数据的行数rowCount和列数columnCount,和有效数据的个数validCount
- 根据validCount创建稀疏数组sparseArray int[validCount + 1][3]
- 将rowCount、columnCount、validCount赋值给稀疏数组的第一行
- 再遍历二维数组将有效数据存入到稀疏数组
稀疏数组转原始的二维数组的步骤: 5. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组 6. 再读取稀疏数组后几行的数据,并赋值给原始的二维数组
代码实现
public class SparseArray {
public static void main(String[] args) {
// 创建原始的二维数组
int[][] sourceArray = new int[10][12];
sourceArray[1][2] = 1;
sourceArray[5][4] = 2;
sourceArray[7][8] = 3;
// 原始的二维数组转稀疏数组
int[][] sparseArray = sourceArray2SparseArray(sourceArray);
// 输出稀疏数组
System.out.println("得到稀疏数组为: ");
for (int i = 0; i < sparseArray.length; i++) {
System.out.printf("%d\t%d\t%d\t\n", sparseArray[i][0], sparseArray[i][1], sparseArray[i][2]);
}
System.out.println();
// 稀疏数组恢复成原始的二维数组
int[][] sourceArray2 = sparseArray2SourceArray(sparseArray);
// 输出恢复后的二维数组
System.out.println("恢复后的二维数组为:");
for (int[] row : sourceArray2) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
// 二维数组转稀疏数组
public static int[][] sourceArray2SparseArray(int[][] sourceArray) {
// 遍历原始的二维数组,得到原始数据的行数rowCount和列数columnCount,和有效数据的个数validCount
int rowCount = sourceArray.length;
int columnCount = 0;
int validCount = 0;
for (int i = 0; i < rowCount; i++) {
columnCount = sourceArray[i].length;
for (int j = 0; j < columnCount; j++) {
if (sourceArray[i][j] != 0) {
validCount++;
}
}
}
// 根据validCount创建稀疏数组sparseArray int[validCount + 1][3]
int[][] sparseArray = new int[validCount + 1][3];
// 将rowCount、columnCount、validCount赋值给稀疏数组的第一行
sparseArray[0][0] = rowCount;
sparseArray[0][1] = columnCount;
sparseArray[0][2] = validCount;
// 再遍历二维数组将有效数据存入到稀疏数组
int rowIndex = 0; // rowIndex用于记录是第几个非0数据, 即稀疏数组的行index
for (int i = 0; i < rowCount; i++) {
for (int j = 0; j < columnCount; j++) {
if (sourceArray[i][j] != 0) {
rowIndex++;
sparseArray[rowIndex][0] = i;
sparseArray[rowIndex][1] = j;
sparseArray[rowIndex][2] = sourceArray[i][j];
}
}
}
return sparseArray;
}
// 稀疏数组转二维数组
public static int[][] sparseArray2SourceArray(int[][] sparseArray) {
// 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
int[][] sourceArray = new int[sparseArray[0][0]][sparseArray[0][1]];
// 再读取稀疏数组后几行的数据,并赋值给原始的二维数组
for (int i = 1; i < sparseArray.length; i++) {
sourceArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
return sourceArray;
}
}
运行程序,结果如下:
得到稀疏数组为:
10 12 3
1 2 1
5 4 2
7 8 3
恢复后的二维数组为:
0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 3 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0