**应用场景:**当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来存储给数组。从而达到压缩数组的目的
稀疏数组的处理方法:
记录数组一共有几行几列,有多少不同的值。
把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。该小规模数组就是稀疏数组。
图例:
java代码实现:
//前提:需要了解二维数组与稀疏数组的关系
public class sparseArray {
//二维数组转稀疏数组
public static int[][] arrayToSparse(int[][] intArr1) {
//遍历二维数组,获取非零元素的个数
int sum = 0;//初始化个数
System.out.println("二维数组:");
for (int[] intArr : intArr1) {
for (int item : intArr) {
System.out.print("\t" + item);
}
System.out.println();
}
for (int[] intArr : intArr1) {
for (int item : intArr) {
if (item != 0) {
sum++;
}
}
}
//得到二维数组非零元素的个数,创建稀疏数组,并在第一行记录二维数组一共有几行几列,有多少不同的值
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//把具有不同值的元素的行列及值记录在除第一行外的其他行中
int count = 0;//稀疏数组的行号
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (intArr1[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = intArr1[i][j];
}
}
}
System.out.println("稀疏数组:");
for (int[] intArr : sparseArr) {
for (int item : intArr) {
System.out.print("\t" + item);
}
System.out.println();
}
return sparseArr;
}
//稀疏数组转二维数组
public static int[][] sparseToArray(int[][] sparseArr) {
//通过稀疏数组的第一行的第一/二列值,恢复二维数组
int[][] intArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
//通过稀疏数组的第一行的第三列值,获取循环次数,并把对应的值放入二维数组中
for (int i = 1; i <= sparseArr[0][2]; i++) {
intArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
System.out.println("二维数组:");
for (int[] intArr : intArr2) {
for (int item : intArr) {
System.out.print("\t" + item);
}
System.out.println();
}
return intArr2;
}
public static void main(String[] args) {
//先创建一个11*11的二维数组
int[][] intArr1 = new int[11][11];
//给二维数组赋值
intArr1[1][1] = 1;
intArr1[1][2] = 2;
intArr1[2][2] = 2;
//二维数组转稀疏数组
int[][] sparseArr = arrayToSparse(intArr1);
//稀疏数组转二维数组
int[][] intArr2 = sparseToArray(sparseArr);
}
}
输出结果: