概念
当一个数组中大部分元素为0,或者为同一值的数字时,可以使用稀疏数组来保存该数组。
举例
二维数组
{
0
0
22
0
0
0
11
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
}
\left\{ \begin{matrix} 0 & 0 & 22 & 0 & 0\\ 0 & 11 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0\\ \end{matrix} \right\}
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧000000110002200000000000000⎭⎪⎪⎪⎪⎬⎪⎪⎪⎪⎫
稀疏数组
index | 行 | 列 | 值 |
---|---|---|---|
0(原数据大小) | 5 | 5 | 2 |
1 | 0 | 2 | 22 |
2 | 1 | 1 | 11 |
二维数组转稀疏数组
- 遍历原始二维数组,得到有效数组的个数sum。
- 根据sum创建稀疏数组。
- 将二维数组的有效数据存入到稀疏数组。
稀疏数组转二维数组
- 先读取稀疏数组的第一行,根据第一行的数据创建原始的二维数组。
- 把稀疏数组的数据赋给二维数组。
代码实现
public class SparseArrayTest {
public static final int LENGTH = 5;
public static void main(String[] args) {
int[][] arrays = initChess();
printChess(arrays);
int[][] sparseArr = chessToSparseArr(arrays);
printSparseArr(sparseArr);
printChess(sparseArrToChess(sparseArr));
}
/**
* 初始化二维数组
*
* @return int[][]
* @author ash
*/
public static int[][] initChess() {
// 创建二维数组
int[][] array = new int[LENGTH][LENGTH];
array[0][2] = 22;
array[1][1] = 11;
return array;
}
/**
* 打印二维数组
*
* @param arr 二维数组
* @return void
* @author ash
*/
public static void printChess(int[][] arr) {
System.out.println("***********二维数组***********");
for (int[] n : arr) {
for (int item : n) {
System.out.printf("%d\t", item);
}
System.out.println();
}
}
/**
* 打印稀疏数组
*
* @param arr 稀疏数组
* @return void
* @author ash
*/
public static void printSparseArr(int[][] arr) {
System.out.println("***********稀疏数组***********");
for (int[] row : arr) {
System.out.printf("%d\t%d\t%d\t\n", row[0], row[1], row[2]);
}
}
/**
* 二维数组转稀疏数组
*
* @param arr 二维数组
* @return int[][]
* @author ash
*/
public static int[][] chessToSparseArr(int[][] arr) {
int sum = 0;
int row = arr.length;
int column = arr[0].length;
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
if (arr[i][j] != 0) {
sum++;
}
}
}
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0] = row;
sparseArr[0][1] = column;
sparseArr[0][2] = sum;
int count = 1;
for (int i = 0; i < LENGTH; i++) {
for (int j = 0; j < LENGTH; j++) {
if (arr[i][j] != 0) {
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = arr[i][j];
count++;
}
}
}
return sparseArr;
}
/**
* 稀疏数组转二维数组
*
* @param arr 稀疏数组
* @return int[][]
* @author ash
*/
public static int[][] sparseArrToChess(int[][] arr) {
int[][] chessArr = new int[arr[0][0]][arr[0][1]];
for (int i = 1; i < arr.length; i++) {
chessArr[arr[i][0]][arr[i][1]] = arr[i][2];
chessArr[arr[i][0]][arr[i][1]] = arr[i][2];
}
return chessArr;
}
}