線性結構和非線性結構java
非線性結構就是結點元素可能存在多個直接前趨和多個直接後續(聯想一下二叉樹就懂了,可是非線性結構不單單隻有二叉樹)。小程序
有這麼一個場景,須要實現一個 10*10 的圍棋的步數記錄。那麼最簡單的就可使用一個二維數組int[10][10]即可,可是在棋盤伊始,這個二維數組幾乎沒有意義的數據。假如能找到將這個二維數組壓縮,只記錄有用的數據的方法就行了。這時候稀疏數組就能夠派上用場了。數組
像上述棋盤,開始的時候,數據中記錄的大部分元素爲 0,或者爲同一個值的數組時,可使用稀疏數組來保存該數組。數據結構
把具備不一樣的元素的行列以及值記錄在一個小規模的數組中,從而壓縮小程序的規模。spa
假若有以下的 10*6的棋盤,用正整數表示落子順序,使用稀疏數組壓縮該棋盤則有右側的表示。第 0 行,分別表示:行數,列數,總有多少個值。從第 1 行開始到最後,都表示行數,列數,數值。code
如此一來,原本是 610 的數組就被壓縮成 37,大大節省了內存空間。blog
- 遍歷原始二維數組,獲得有效數據的個數 sum
- 建立稀疏數組 sparseArr[sum+1][3]
- 把有效數據逐個填入稀疏數組 sparseArr 中
/** * 二維數組轉稀疏數組 * * @param arr 原數組 * @return 稀疏數組 */ public int[][] reserveSparseArray(int[][] arr) { // 統計有效數據 int sum = 0; // 遍歷稀疏數組 for (int[] is : arr) { for (int num : is) { if (num != 0) { sum++; } } } // 建立稀疏數組 int[][] sparseArr = new int[sum + 1][3]; sparseArr[0][0] = arr.length; sparseArr[0][1] = arr[0].length; sparseArr[0][2] = sum; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { if (arr[i][j] != 0) { sparseArr[sum][0] = i; sparseArr[sum][1] = j; sparseArr[sum][2] = arr[i][j]; sum--; } } } return sparseArr; }
- 讀取稀疏數組的第 1 行,取出第一 row、第二個數 col,建立二維數組 shessArr[row][col]
- 遍歷稀疏數組後面幾行,把有效值填入原數組 chessArr
/** * 稀疏數組轉二位數組 * * @param sparseArr 稀疏數組 * @return 原數組 */ public static int[][] reserveOriginalArray(int[][] sparseArr) { // 根據稀疏數組第一行建立原數組 int[][] originalArr = new int[sparseArr[0][0]][sparseArr[0][1]]; // 把稀疏數組的值放回到原數組中 for (int i = 1; i < sparseArr.length; i++) { int row = sparseArr[i][0]; int col = sparseArr[i][1]; int value = sparseArr[i][2]; originalArr[row][col] = value; } return originalArr; }
人若無名,專心練劍!
喜歡的朋友能夠留下你的贊!隊列