二維數組的壓縮存儲,稀疏數組

在二維數組只有少部分有效數據的時候,爲了不存儲過多的無效數據,我們可以使用稀疏數組來存儲二維數組。

下面是一個五子棋的殘局,用二維數組表示之後,會發現有很多0的無效數據,這個時候就可以使用稀疏數組保存二維數組。

 

從一個11*11的數組壓縮成3*3的稀疏數組,節省了內存開支。

稀疏數組是一個列數固定行數爲二維數組中有效數據的個數+1

第一行第一列是二維數組的行數

第一行第二列是二維數組的列數

第一行第三列是二維數組中有效數據的個數

第二行第一列是第一個有效數據在二維數組中的行

第二行第二列是第一個有效數據在二維數組中的列

第二行第三列是第一個有效數據的值

第三行第一列是第二個有效數據在二維數組中的行

第三行第二列是第二個有效數據在二維數組中的列

第三行第三列是第二個有效數據的值

……

 

二維數組轉稀疏數組的思路

1,遍歷原始二維數組,得到有效數據的個數 sum

2,根據sum就可以創建稀疏數組int[][] sparseArr = new int[sum+1][3];

3,將二維數組的有效數據存入稀疏數組

稀疏數組轉原始二維數組的思路

1,先讀取稀疏數組的第一行,根據第一行的數據,創建原始二維數組,比如上面的int[][] chessArr = new int[11][11];

2,再讀取稀疏數組後幾行的數據,並賦給原始的二維數組即可

代碼實現:

    public static void main(String[] args) {
        //創建一個二維數組 11*11
        //0:表示沒有棋子,1:表示黑子 ,2:表示籃子
        int[][] chessArr1 = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;

        //輸出原始的二維數組
        System.out.println("原始二維數組");
        for (int[] row : chessArr1){
            for (int data : row){
                System.out.print(data+"\t");
            }
            System.out.println();
        }


        //1,遍歷二維數組,得到有效數據的個數
        int sum = 0;
        for (int i = 0;i<chessArr1.length;i++){
            for (int j = 0;j<chessArr1[0].length;j++){
                if(chessArr1[i][j] != 0){
                    sum++;
                }
            }
        }

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

        //遍歷二維數組,將非零的值存放到sparseArr中
        int count = 0;
        for (int i = 0;i<chessArr1.length;i++){
            for (int j = 0;j<chessArr1[0].length;j++){
                if(chessArr1[i][j] != 0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                }
            }
        }

        //3,輸出得到的稀疏數組
        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]);
        }

        //4,將稀疏數組恢復成二維數組
        //根據稀疏數組第一行的數據創建二維數組
        int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];

        //讀取稀疏數組的後幾行數據,從第二行開始,並賦給原始數組
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

        System.out.println("恢復後的二維數組");
        for (int[] row : chessArr1){
            for (int data : row){
                System.out.print(data+"\t");
            }
            System.out.println();
        }
    }

執行結果:

 

 

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