稀疏数组

稀疏数组是当数组中存在大量无效元素时,可以用稀疏数组来保存,节省空间。

场景:

  1)压缩数据

  2)保存棋盘,地图等

将二维数组转换为稀疏数组:

1)遍历获取有效值个数sum

2)创建一个行数为sum+1,列数为3的二维数组

3)第一行第一列为原数组行数,第一行第二列为原数组列数,第一行第三列为有效值个数

4)遍历原数组,保存各有效值的行数、列数、值

将稀疏数组转换为二维数组:

1)根据稀疏数组第一列创建相应大小的二维数组

2)遍历稀疏数组,将有效值放回数组中

代码如下:

 1 public class SparseArray {
 2     public static void main(String[] args) {
 3         int chessArr1[][] = new int[11][11];
 4         chessArr1[1][2] = 1;
 5         chessArr1[2][3] = 2;
 6         chessArr1[4][5] = 2;
 7         System.out.println("Original binary array~");
 8         for (int[] row : chessArr1) {
 9             for (int data : row) {
10                 System.out.printf("%d\t", data);
11             }
12             System.out.println();
13         }
14 
15         int sum = 0;
16         for (int i = 0; i < 11; i ++) {
17             for (int j = 0; j < 11; j ++) {
18                 if (chessArr1[i][j] != 0) {
19                     sum ++;
20                 }
21             }
22         }
23 
24         int sparseArray[][] = new int[sum + 1][3];
25         sparseArray[0][0] = 11;
26         sparseArray[0][1] = 11;
27         sparseArray[0][2] = sum;
28         int count = 0;
29         for (int i = 0; i < 11; i ++) {
30             for (int j = 0; j < 11; j ++) {
31                 if (chessArr1[i][j] != 0) {
32                     count++;
33                     sparseArray[count][0] = i;
34                     sparseArray[count][1] = j;
35                     sparseArray[count][2] = chessArr1[i][j];
36                 }
37 
38             }
39         }
40         System.out.println("SparsArray~~~~");
41         for (int i = 0; i < sparseArray.length; i ++) {
42             System.out.printf("%d\t%d\t%d\t\n", sparseArray[i][0], sparseArray[i][1], sparseArray[i][2]);
43         }
44         System.out.println();
45 
46         int chessArr2[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
47         for (int i = 1; i < sparseArray.length; i ++) {
48             chessArr2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
49         }
50         System.out.println("array recover~~~");
51         for (int[] row : chessArr2) {
52             for (int data : row) {
53                 System.out.printf("%d\t", data);
54             }
55             System.out.println();
56         }
57 
58     }
59 }

思考:

遍历两次感觉有点繁琐,但是网上查找资料好像没有提到这一点的,留着这个问题如果后续又找到答案回来解答。

posted @ 2021-08-30 10:44  墨梅青莲  阅读(38)  评论(0)    收藏  举报