1. 背景
最近在看 B站狂神的视频,了解到了一个稀疏数组的概念,在此记录一下。
2. 稀疏数组介绍
- 当一个数组中大部分元素为 0,或者同一值的数组时,可以使用稀疏数组来保存该数组;
- 稀疏数组的处理方式是:
- 记录数组一共有几行几列,有多少个不同值。
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模。
- 如下图:
3. 代码展示
package array;
public class Demo03 {
public static void main(String[] args) {
int[][] src = new int[11][11];
src[1][2] = 1;
src[2][2] = 2;
print2DArray(src);
System.out.println("========================");
int[][] tar = center(src);
print2DArray(tar);
System.out.println("========================");
int[][] result = deCenter(tar);
print2DArray(result);
}
/**
* 聚合化
* @param src - 稀疏数组
* @return 聚合后的数组
*/
public static int[][] center(int[][] src) {
int sum = getSum(src);
int[][] a = new int[sum + 1][3];
a[0][0] = src.length;
a[0][1] = src[0].length;
a[0][2] = sum;
int i = 1;
for (int j = 0; j < src.length; j++) {
for (int k = 0; k < src.length; k++) {
if (src[j][k] != 0) {
a[i][0] = j;
a[i][1] = k;
a[i][2] = src[j][k];
i++;
}
}
}
return a;
}
/**
* 获取稀疏数组中不为零的元素个数
* @param src - 稀疏数组
* @return 不为零的元素个数
*/
public static int getSum(int[][] src) {
int sum = 0;
for (int i = 0; i < src.length; i++) {
for (int j = 0; j < src[i].length; j++) {
int b = src[i][j];
if (b != 0) {
sum++;
}
}
}
return sum;
}
/**
* 稀疏数组
* @param tar - 聚合后的数组
* @return 原稀疏数组
*/
public static int[][] deCenter(int[][] tar) {
int i = tar[0][0];
int j = tar[0][1];
int[][] ret = new int[i][j];
for (int k = 1; k < tar.length; k++) {
ret[tar[k][0]][tar[k][1]] = tar[k][2];
}
return ret;
}
/**
* 打印二维数组
* @param a - 二维数组
*/
public static void print2DArray(int[][] a) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
int b = a[i][j];
System.out.print(b + "\t");
}
System.out.println();
}
}
}
4. 运行结果
0 0 0 0 0 0 0 0 0 0 0
0 0 1 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 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 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
========================
11 11 2
1 2 1
2 2 2
========================
0 0 0 0 0 0 0 0 0 0 0
0 0 1 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 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 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0