稀疏数组
概念
当一个数组在中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法
1.记录数组一共有几行几列,有多少个不为0的值。
2.把不为0的元素的行列以及值记录在一个小规模的数组中,从而做到压缩原始数组
原始数组如下
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 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的数
之后的每一行的列分别记录:不为0数在原始数组中所在的行,不为0数在原始数组中所在的列,不为0数的值
11 | 11 | 2 |
---|---|---|
1 | 2 | 1 |
2 | 3 | 2 |
代码实现
以上述例子来实现我们的代码,需要做到从原始数组转换成稀疏数组,再从稀疏数组转化成原始数组。
原始数组->稀疏数组
- 遍历原始数组,得到一共有多少个非0的数sum
- 创建稀疏数组,行为sum+1,列为3
- 遍历原始数组,为稀疏数组赋值
稀疏数组->原始数组
- 读取稀疏数组的第一行,第一列和第二列,创建二维数组
- 遍历稀疏数组,填充二维数组
public class SparseArray {
public static void main(String[] args) {
//创建一个11*11的棋盘
int chessArray[][] = new int[11][11];
chessArray[1][2] = 1;
chessArray[2][3] = 2;
System.out.println("原始数组~~~");
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[i].length; j++) {
System.out.printf("%d\t",chessArray[i][j]);
}
System.out.println();
}
/*
将原始数组转换为稀疏数组
1.遍历原始数组,得到一共有多少个非0的数sum
2.创建稀疏数组,行为sum+1,列为3
3.遍历原始数组,为稀疏数组赋值
*/
int sum = 0;
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[i].length; j++) {
if (chessArray[i][j] != 0){
sum++;
}
}
}
System.out.println();
//System.out.println(sum);
int sparseArray[][] = new int[sum+1][3];
sparseArray[0][0] = chessArray.length;
sparseArray[0][1] = chessArray[0].length;
sparseArray[0][2] = sum;
//用于计数,表示当前是第几个非0数
int count = 0;
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[i].length; j++) {
if (chessArray[i][j] != 0){
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chessArray[i][j];
}
}
}
System.out.println("稀疏数组~~~");
for (int i = 0; i < sparseArray.length; i++) {
System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
}
System.out.println();
/*
将稀疏数组转换为二维数组
1.读取稀疏数组的第一行,第一列和第二列,创建二维数组
2.遍历稀疏数组,填充二维数组
*/
int convertArray[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {
convertArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
System.out.println("二维数组~~~");
for (int i = 0; i < convertArray.length; i++) {
for (int j = 0; j < convertArray[i].length; j++) {
System.out.printf("%d\t",convertArray[i][j]);
}
System.out.println();
}
}
}