稀疏数组
定义
压缩数组。当数组中存在大量没有意义的元素时,可以采用稀疏数组压缩数组。
原数组arr=
0 0 0 0 0 1 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
可以压缩为:
压缩数组arr_zip=
8 8 2
0 5 1
1 4 2
其中,arr_zip[0],记录了原数组的行arr_zip[0][0]
、列arr_zip[0][1]
及全部元素的数量arr_zip[0][2]
。
后面的每一行都记录了一个数组元素的位置及元素的值。把原来8*8
的二位数组,转换为3*3
的二维数组,节约了大量空间。
代码实现
import java.util.*;
/**
* @author leekari
* @date 2020/10/16 14:33
* @description
*/
public class SparseArray {
/**
* 数组压缩为稀疏数组
* @param arr
* @return
*/
public static int[][] arrayToSparse(int[][] arr){
List<int[]> list = new LinkedList<>();
int[] init = new int[3];
init[0] = arr.length;
init[1] = arr[0].length;
int count = 0;
for (int i = 0; i < arr.length; ++i) {
int[] row = arr[i];
for (int j = 0; j < row.length; ++j) {
if (arr[i][j] != 0){
int[] param = new int[3];
param[0] = i;
param[1] = j;
param[2] = arr[i][j];
list.add(param);
count++;
}
}
}
init[2] = count;
list.add(0, init);
int[][] sparse = new int[3][list.size()];
int idx = 0;
for (int[] i: list) {
sparse[idx++] = i;
}
return sparse;
}
public static int[][] arrayToSparse1(int[][] arr){
int sum = 0;
for (int[] row: arr) {
for (int i: row) {
if (i != 0) {
sum++;
}
}
}
int[][] sparse = new int[sum + 1][3];
sparse[0][0] = arr.length;
sparse[0][1] = arr[0].length;
sparse[0][2] = sum;
int k = 1;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
if(arr[i][j] != 0){
sparse[k][0] = i;
sparse[k][1] = j;
sparse[k][2] = arr[i][j];
k++;
}
}
}
return sparse;
}
/**
* 稀疏数组还原为原数组
* @param sparse
* @return
*/
public static int[][] sparseToArray(int[][] sparse){
int row = sparse[0][0];
int col = sparse[0][1];
int count = sparse[0][2];
int[][] arr = new int[row][col];
for (int i = 0; i < count; ++i){
int[] line = sparse[i + 1];
arr[line[0]][line[1]] = line[2];
}
return arr;
}
public static void main(String[] args) {
int[][] arr = new int[8][8];
arr[0][5] = 1;
arr[1][4] = 2;
int[][] spares = arrayToSparse(arr);
System.err.println(Arrays.deepToString(arr));
System.out.println(Arrays.deepToString(sparseToArray(spares)));
}
}