在遇到棋盤或者地圖等問題時,常常需要構造一個二維陣列。以棋盤為例,需要大量的0(或者其他相同的預設數值)來組成棋盤的基本結構,而陣列中非0值的位置卻很少。為了節省空間,可以用稀疏陣列來儲存相應資訊。
稀疏陣列是一個3列的二維陣列,稀疏陣列的第一行總是儲存原來二維陣列的行列和有效值的資訊。分別是:
- 第一行第一列存原來二維陣列的總行數
- 第一行第二列存原來二維陣列的總列數
- 第一行第三列存原來二維陣列的非0(有效)值的總個數
從稀疏陣列的第二行往下,存放原來二維陣列的有效資訊,每一個有效值的資訊在稀疏陣列中的存放形式如下:
- 第1列存放某一個有效值出現的行
- 第2列存放那一個有效值出現的列
- 第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 }