重學數據結構 --- 分類+稀疏數組

1、數據結構的分類

1. 數據結構兩大類

線性結構非線性結構java

1) 線性結構

  • 線性結構是最多見的數據結構,特色是元素間存在一對一的線性關係。
  • 線性結構又分兩種,一種是順序存儲(稱爲順序表),另一種是鏈式存儲(稱爲鏈表)。順序表中的存儲元素的連續的。鏈表中的存儲元素不必定是連續的,元素節點中存放數據元素以及相鄰元素的地址信息。
  • 常見的線性結構有:數組、隊列、鏈表和棧(這裏只是講個大概,具體內容後面的文章會展開闡述)。

2) 非線性結構

非線性結構就是結點元素可能存在多個直接前趨和多個直接後續(聯想一下二叉樹就懂了,可是非線性結構不單單隻有二叉樹)。小程序

  • 非線性結構包括:多維數組、廣義表、樹結構、圖結構。

2、稀疏數組

1. 稀疏數組(sparse array)

1) 分析場景

有這麼一個場景,須要實現一個 10*10 的圍棋的步數記錄。那麼最簡單的就可使用一個二維數組int[10][10]即可,可是在棋盤伊始,這個二維數組幾乎沒有意義的數據。假如能找到將這個二維數組壓縮,只記錄有用的數據的方法就行了。這時候稀疏數組就能夠派上用場了。數組

2) 稀疏數組

像上述棋盤,開始的時候,數據中記錄的大部分元素爲 0,或者爲同一個值的數組時,可使用稀疏數組來保存該數組。數據結構

3) 稀疏數組的處理方法是:

  • 記錄數組一共有幾行幾列,有多少個不一樣的值
  • 把具備不一樣的元素的行列以及值記錄在一個小規模的數組中,從而壓縮小程序的規模。

4) 舉個例子:

假若有以下的 10*6的棋盤,用正整數表示落子順序,使用稀疏數組壓縮該棋盤則有右側的表示。第 0 行,分別表示:行數,列數,總有多少個值。從第 1 行開始到最後,都表示行數,列數,數值。spa

稀疏數組

如此一來,原本是 610 的數組就被壓縮成 37,大大節省了內存空間。code

5) 代碼實現

思路分析

(1) 二維數組轉稀疏數組
  1. 遍歷原始二維數組,獲得有效數據的個數 sum
  2. 建立稀疏數組 sparseArr[sum+1][3]
  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;
}
(2) 稀疏數組轉原始數組
  1. 讀取稀疏數組的第 1 行,取出第一 row、第二個數 col,建立二維數組 shessArr[row][col]
  2. 遍歷稀疏數組後面幾行,把有效值填入原數組 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;
}

人若無名,專心練劍! 喜歡的朋友能夠留下你的贊!blog

相關文章
相關標籤/搜索