數據結構-數組-大量重複數據優化處理

今天要和大家分享的內容非常的乾貨。大家在做項目的過程中可能會遇到這種問題,通過數組實現一個功能的時候,發現數組中有大量的重複數據。沒有研究過數據結構的人可能感覺沒有什麼,依舊是一大坨數的存儲、讀取。
而研究過數據結構的朋友就不會這麼死板。我也不賣關子了,今天我就給大家介紹一下今天的主角–>稀疏數組。

使用場景:當一個數組中的大部分元素爲同一個值時,可以使用稀疏數組來保存該數組。 把存放二維數組的方式 變成存放行列和值進行數據量的壓縮。

具體處理方法:
1)記錄數組一共有幾行幾列,有多少個不同的值。
2)把具有不同值的元素的行列及值記錄在一個小規模的數組中,從而縮小程序的規模。
比如下面這中數據中含有大量的0,我們通過稀疏數組的方式進行優化。
在這裏插入圖片描述
稀疏數組的第一行記錄的是數組的整體數據,一共有幾行,有幾列,有幾個不是大量重複的數據。稀疏數組的思想就是讓我們只需要記錄這些不同數據的位置和值。

圖示稀疏數組
在這裏插入圖片描述
代碼實例
public class SparseArray {
public static void main(String[] args) {
//創建一個原始的二位數組 11 * 11
int[][] chessArr1 =new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[4][5] = 2;
//輸出原始的二維數組
System.out.println(“原始的二維數組”);
for (int[] row : chessArr1) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}

    //將二維數組 轉稀疏數組的思想
    //1.先遍歷二維數組 得到非0數據的個數
    int sum = 0;
    for (int i = 0; i < chessArr1.length; i++) {
        for (int j = 0; j < chessArr1.length; j++) {
            if (chessArr1[i][j] !=0){
                sum ++;
            }

        }

    }
    System.out.println("sum=" + sum);

    //創建對應的稀疏數組
    int[][] sparseArr= new int[sum +1][3];
    //給稀疏數組賦值
    sparseArr[0][0] = 11;
    sparseArr[0][1] = 11;
    sparseArr[0][2] = sum;

    //遍歷二維數組,將非0的值存放到sparseArr中
    /**
     * 用於記錄是第幾個非0數據
     */
    int count = 0;
    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < 11; j++) {
           if (chessArr1[i][j] != 0){
               count++;
               sparseArr[count][0] = i;
               sparseArr[count][1] =j;
               sparseArr[count][2] =chessArr1[i][j];
           }

        }

    }

    //輸出稀疏數組的形式
    System.out.println();
    System.out.println("得到的稀疏數組爲~");
    for (int i = 0; i < sparseArr.length; i++) {
        System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
    }
    System.out.println();

    //將稀疏數組 --》恢復成
    /**
     * 1.先讀取稀疏數組的第一行,根據第一行的數據,創建原始的二維數組
     * 2.在讀取稀疏數組後幾行的數據,並賦給 原始的二維數組 即可。從第二行開始
     */
    int [][] chessArray2 = new int[sparseArr[0][0]][sparseArr[0][1]];

    for (int i = 1; i < sparseArr.length; i++) {
         chessArray2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
    }

    //輸出恢復後的二位數組
    System.out.println();
    System.out.println("恢復後的二維數組~");
    for (int[] row : chessArray2) {
        for (int data : row) {
            System.out.printf("%d\t",data);
        }
        System.out.println();
    }
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章