含义
- 一个数组大部分值都是0或其他没有意义的数据,可以用稀疏数组表示,起到压缩作用
应用场景
假设存在二维数组如下
0 | 0 | 0 | 0 | 7 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 2 | 5 | 5 | 0 |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 4 |
正常情况下我们需要创建一个二维数组array
,其中存放 5×5=25个数据。但大多数据都没用意义。
采用稀疏数组表示如下:
5(表示一共5行) | 5(表示一共5列) | 6(表示一共6个值) |
---|---|---|
0(第0+1行) | 4(第0+4列) | 7(值为7) |
2 | 1 | 2 |
2 | 2 | 5 |
2 | 3 | 5 |
4 | 1 | 1 |
4 | 4 | 4 |
- 介绍数组一共几行几列,有几个有效数据
- 第n行,第m列的值为x
- …
累计存放 3×7=21 个数据,在数据量大且相同值多的数据,有优势。例如围棋,地图等产品
转换过程
二维数组 --> 稀疏数组
- 遍历二维数组,获取有效数据
sum
- 根据
sum
创建稀疏数组sparseArr int[sum+1][3]
- 将二维数组的有效数据存入稀疏数组
稀疏数组–> 二维数组
- 读取稀疏数组第一行,获取行列数,创建原始状态下的二维数组
- 读取稀疏数组后几行,赋予n行,m列的值
代码实现
- 初始化二维数组
//① 创建一个原始的二维数据 11×11
int[][] array = new int[11][11];
//② 初始化部分值
array[1][2] = 1;
array[2][3] = 2;
for (int[] row : array) {
for (int co1 : row) {
System.out.printf("%d\t", co1);
}
System.out.println();
}
System.out.println();
System.out.println();
- 二维数组 --> 稀疏数组
//③ 二维数组转稀疏数组,得到非0数据的个数
int sum = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] != 0) {
sum++;
}
}
}
//④创建稀疏数组
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0] = array.length;
sparseArr[0][1] = array[0].length;
sparseArr[0][2] = sum;
// ⑤非0的值存入
//计数器
int count = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = array[i][j];
}
}
}
for (int[] row : sparseArr) {
for (int co1 : row) {
System.out.printf("%d\t", co1);
}
System.out.println();
}
System.out.println();
System.out.println();
- 稀疏数组–> 二维数据
//⑥ 稀疏数组转二维数组
int[][] arr1 = new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i < sparseArr.length; i++) {
arr1[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
for (int[] row : arr1) {
for (int co1 : row) {
System.out.printf("%d\t", co1);
}
System.out.println();
}
System.out.println();
System.out.println();