基本概念
当一个数组中,大部分值都是0或者是同一个值时,如果全部进行存储,会浪费空间,这个时候就可以把这个数组转换为稀疏数组。
如下图(图片来源网络),大部分都是0,真正用到的就是5个值。
进行转换之后就是下图,具体转换的规则由两部分组成,第一部分就是记录的原数组总的行数,列数,使用值的个数。第二部分就是记录的每个具体使用值的坐标(行数,列数)和具体值。
经过上面的转换,之前需要声明7x9=63大小的数组,现在只需要声明 3x6=18大小的数组,节省了很大的空间。
原始数组和稀疏数组相互转换代码
package com.example.demo.dataStructure;
public class SparseArr {
public static void main(String[] args) {
int rows = 9;
int columns = 7;
int[][] array = new int[9][7];
array[1][1] = 3;
array[3][0] = 1;
array[3][1] = 4;
array[4][2] = 7;
array[5][5] = 5;
System.out.println("初始化数组为:");
printArr(array);
int sum = 0;
for (int[] i : array) {
for (int j : i) {
if (j != 0) {
sum++;
}
}
}
//原数组转稀疏数组
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0] = rows;
sparseArr[0][1] = columns;
sparseArr[0][2] = sum;
int count = 1;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] != 0) {
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count++][2] = array[i][j];
}
}
}
System.out.println("转换后数组为:");
printArr(sparseArr);
//再还原数组
int[][] arr = new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i < sparseArr.length; i++) {
arr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
System.out.println("还原后数组为:");
printArr(arr);
}
private static void printArr(int[][] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
输出的结果如下:
初始化数组为:
0 0 0 0 0 0 0
0 3 0 0 0 0 0
0 0 0 0 0 0 0
1 4 0 0 0 0 0
0 0 7 0 0 0 0
0 0 0 0 0 5 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
转换后数组为:
9 7 5
1 1 3
3 0 1
3 1 4
4 2 7
5 5 5
还原后数组为:
0 0 0 0 0 0 0
0 3 0 0 0 0 0
0 0 0 0 0 0 0
1 4 0 0 0 0 0
0 0 7 0 0 0 0
0 0 0 0 0 5 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
解决一些二维数组存储可以用稀疏数组,网上的例子大都是五子棋和围棋等,也算是稀疏数组的简单运用。