前言:
算法学习笔记 案例使用 java 实现
若有不足之处望大佬们指出(*^▽^*)
目录
1.使用场景
当一个数组大部分值为0,或为同一个值时,可使稀疏数组(sparse array)来保存数组
2.处理方法
-
记录数组有几行几列,有多少个不同值
-
把具有不同的值的元素的行列及值记录在个小规模的数组上,从而缩小程序规模
3.思路分析
-
原始二维数组转稀疏数组
-
遍历原始二维数组,获得有效值个数 sum
-
根据sum创建稀疏数组 sparseArr int[sum+1][3]
-
将原始二维数组有效值存入稀疏数组
-
-
稀疏数组转原始二维数组
-
先读取稀疏数组第一行,根据一行数组创建原始二维数组
-
继续读取稀疏数组后几行值,赋给原始二维数组
-
-
图解分析
4.代码实现
class sparseArray {
public static void main(String[] args) {
// 创建原始数组 5行5列数组
int[][] arr = new int[5][5];
// 给原始数组赋值 设定有效值
arr[1][1] = 2;
arr[2][2] = 3;
arr[2][4] = 8;
arr[4][4] = 7;
// 查看原始数组
System.out.print("原创建的始数组:\n");
for (int[] row : arr) {
for (int val : row) {
System.out.printf("%d\t", val);
}
System.out.println();
}
// - 原始二维数组转稀疏数组
// - 遍历原始二维数组,获得有效值个数 sum
int sum = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
sum++;
}
}
}
// - 根据sum创建稀疏数组 sparseArr int[sum+1][3]
int[][] sparseArr = new int[sum + 1][3];
// 给稀疏数组第一行赋值 获取原始数组的行数,列数,有效值数
sparseArr[0][0] = arr.length;
sparseArr[0][1] = arr[0].length;
sparseArr[0][2] = sum;
// - 将原始二维数组有效值存入稀疏数组 count用于记录当前有效值位数
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = arr[i][j];
}
}
}
System.out.print("\n得到的稀疏数组:\n");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%d\t%d\t%d\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
}
// - 稀疏数组转原始二维数组
// - 先读取稀疏数组第一行,根据一行数组创建原始二维数组
int[][] brr = new int[sparseArr[0][0]][sparseArr[0][1]];
// - 继续读取稀疏数组后几行值,赋给原始二维数组 从第二行开始读取
for (int i = 1; i < sparseArr.length; i++) {
brr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
// 遍历新二维数组brr
System.out.println("由稀疏数组获得的二维数组brr");
for (int[] row : brr) {
for (int val : row) {
System.out.printf("%d\t", val);
}
System.out.println();
}
}
}