算法02-稀疏sparsearray數組

稀疏數組

    當一個數組中大部分元素爲0(null),或者爲同一個值數組時,可以使用稀疏數組來保存該數組。

    稀疏數組的處理方法是:

        1.記錄數組一共幾行幾列,有多少個不同的值

        2.把具有不同值得元素的行列及值記錄在一個小規模的數組中,從而縮小程序的規模

                                     

如圖數據大概左面這樣,右邊爲稀疏數組記入的值,如果用以前的數組記入就會有10(行)X9(列)=90個元數據,但是用稀疏數組就是2(行)X3(列)=6個元數據,大大節省了空間(前提是數據有很多重複的值,甚至就是空或者沒有值)

 

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

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

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

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

 

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

1.先讀取稀疏數組的第一行,根據第一行的數據創建原始的二位數組,chessArr2=int[9][10]

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

 

代碼實現

 public static void main(String[] args) {
        // 先創建一個原始的二維數組 9*10
        // 0:表示沒有值,*:表示值爲*
        int chessArr1[][] = new int[9][10];
        chessArr1[1][1] = 1;
        chessArr1[2][2] = 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[0].length; j++) {
                if (chessArr1[i][j] != 0) {
                    sum++;
                }
            }
        }
//        System.out.println(sum);  // 2
        // 創建對應的稀疏數組
        int sparseArr[][] = new int[sum + 1][3];
        //  2.給稀疏數組賦值
        sparseArr[0][0] = 9;    // 數據一共幾行
        sparseArr[0][1] = 10;   // 數據一共幾列
        sparseArr[0][2] = sum;  // 一共有多少個非0的值
        //  3.遍歷二維數組 將非0的值存放到 sparseArr中
        int count = 0; // 用於記入是第幾個非 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] = i;
                    sparseArr[count][2] = i;
                }
            }
        }
        // 輸出稀疏數組的形式
        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]);
        }


        // 稀疏數組 轉 二維數組
        //   1.先讀取稀疏數組的第一行,根據第一行的數據,創建原始的二維數組
        int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
        //   2.讀取稀疏數組後幾行數據(從第二行開始),並賦予原始的二維數據
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        // 輸出恢復後的二維數組
        System.out.println("恢復後的二維數組");
        for (int[] row : chessArr2) {
            for (int data : row) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
    }

效果截圖 

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