稀疏数组

稀疏数组

稀疏数组就是数组中,大部分的元素值都未被使用(或都为0),在数组中仅有少 部分的空间使用。因此造成内存空间的浪费,为了解决这问题,并且不影响数组中原 有的元素值,我们采用了一种压缩的方式来 表示稀疏数组的内容。
如图二维数组所示,有大部分的空间是无用的。

在这里可以使用稀疏数组进行压缩。其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间。

代码实现

将二维数组变成稀疏数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class SparseArray {
private static final int row = 9;
private static final int col = 7;
public static void main(String[] args) {
// 创建一个原始的二维数组
int arr[][] = new int[row][col];
arr[1][1]=3;
arr[3][0]=1;
arr[3][1]=4;
arr[4][2]=7;
arr[5][5]=5;
System.out.println("输入原始二维数组-----------------");
prt(arr);
System.out.println("-------------------------------");

// 将二维数组变成稀疏数组
// 遍历得到非零数据个数
int sum=0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if(arr[i][j]!=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 count =0; // 用于记录第几个非零
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if(arr[i][j]!=0){
count++;
sparse[count][0] = i;
sparse[count][1] = j;
sparse[count][2] = arr[i][j];
}
}
}
// 输出稀疏数组
System.out.println("输出稀疏数组");
prt(sparse);

// 将稀疏数组还原成二维数组
int arr2[][] =new int[sparse[0][0]][sparse[0][1]];
for (int i = 1; i <sparse.length ; i++) {
arr2[sparse[i][0]][sparse[i][1]] = sparse[i][2];
}
System.out.println("输出还原的二维数组");
prt(arr2);
}
public static void prt(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]+" ");
}
System.out.println("\n");
}
}
}


稀疏数组
http://example.com/2019/06/03/稀疏数组/
作者
shoukailiang
发布于
2019年6月3日
许可协议