稀疏陣列

隨遇而安==發表於2022-03-04

在遇到棋盤或者地圖等問題時,常常需要構造一個二維陣列。以棋盤為例,需要大量的0(或者其他相同的預設數值)來組成棋盤的基本結構,而陣列中非0值的位置卻很少。為了節省空間,可以用稀疏陣列來儲存相應資訊。

稀疏陣列是一個3列的二維陣列,稀疏陣列的第一行總是儲存原來二維陣列的行列和有效值的資訊。分別是:

  1. 第一行第一列存原來二維陣列的總行數
  2. 第一行第二列存原來二維陣列的總列數
  3. 第一行第三列存原來二維陣列的非0(有效)值的總個數

從稀疏陣列的第二行往下,存放原來二維陣列的有效資訊,每一個有效值的資訊在稀疏陣列中的存放形式如下:

  1. 第1列存放某一個有效值出現的行
  2. 第2列存放那一個有效值出現的列
  3. 第3列存放那個有效的值

原來一個9*9的大陣列,在使用稀疏陣列後,變成一個5*3的小陣列,節約了空間。圖上能反應出稀疏陣列與原來二維陣列的對應關係。

  • 二維陣列-->稀疏陣列

通過遍歷原來的二維陣列可以找到每一個有效值的資訊,然後賦值給稀疏陣列。

java程式碼實現:

 1  public static int[][] twoToSparse(int[][] arr) {
 2         //將二維陣列變成稀疏陣列
 3         int sum = 0; //記錄原陣列有幾個非0的值,用於確定稀疏陣列的行數
 4         int columnNum = 0; //記錄原陣列的列數
 5         for (int[] ints : arr) {
 6             columnNum = ints.length; //獲取列數
 7             for (int anInt : ints) {
 8                 if (anInt != 0) {
 9                     sum++;
10                 }
11             }
12         }
13         int[][] sparseArr = new int[sum + 1][3];
14         sparseArr[0][0] = arr.length;
15         sparseArr[0][1] = columnNum;
16         sparseArr[0][2] = sum;
17         int count = 0;//紀錄出現的值是第幾個
18         for (int i = 0; i < arr.length; i++) {  //遍歷原來的二維陣列,找到非0處的值,將資訊賦值給稀疏陣列
19             for (int j = 0; j < columnNum; j++) {
20                 if (arr[i][j] != 0) {
21                     count++; //第幾個出現就放在第幾行(第0行存放原陣列的 總行數,總列數,總非0的值的數量)
22                     sparseArr[count][0] = i; //第一列存放行數
23                     sparseArr[count][1] = j; //第二列存放列數
24                     sparseArr[count][2] = arr[i][j]; //第三列存放具體的值
25                 }
26             }
27         }
28         return sparseArr;
29     }
  • 稀疏陣列-->二維陣列

通過遍歷稀疏陣列的資訊,很快就能獲得二維陣列的資訊,然後將原來需要的二維陣列恢復。

java程式碼實現:

 1     public static int[][] sparseToTwo(int[][] sparseArr) {
 2         //將稀疏陣列恢復成二維陣列
 3         int[][] arr = new int[sparseArr[0][0]][sparseArr[0][1]]; //利用稀疏陣列中第一行的總行列數資訊,建立一個二維陣列
 4         if (sparseArr[0][2] == 0) {
 5             return arr; //沒有有效值,直接返回只有預設值的陣列,這裡預設值是0,不需要進行另外的賦值操作
 6         } else {
 7             for (int i = 1; i < sparseArr.length; i++) {
 8                 arr[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];  //遍歷稀疏陣列,讀取行,列,值資訊,賦給二維陣列
 9 
10             }
11             return arr;
12         }
13     }

 

 

 

相關文章