二維陣列和稀疏陣列互轉

頂風少年發表於2020-10-05

稀疏陣列可以看做是普通二維陣列的壓縮,為什麼要對陣列進行壓縮呢?常見的場景是地圖,棋盤。這些容器都是行和列組成的二維陣列,在陣列中的一些點上標記著特殊的位置。但是這些標記位相對於整個二維陣列來說只使用了一小部分,陣列中剩餘的部分都是預設值。如果我們將一個地圖儲存到使用者的磁碟中,會造成不必要的空間浪費。於是才有了稀疏陣列對二維陣列進行壓縮。

二維陣列轉換稀疏陣列的思路是

1 確定二維陣列的行,列,標記點的個數,用於還原二維陣列。

2 找到每一個標記點所在的行,列和值。

3 將1,2構成一個新的N行3列的稀疏陣列。

例如二維陣列是8*8的矩陣,實際的標記點只有三個,其餘的全是預設值0。

 

轉換成稀疏陣列後是4*3的二維陣列,其中第一行記錄了源陣列的行,列,標記點個數。剩餘三行則記錄了標記點的位置和值。

 

最後附上程式碼

二維陣列和稀疏陣列互轉
public static void main(String[] args) {
        int[][] twoArray = new int[8][8];
        twoArray[1][3] = 1;
        twoArray[3][1] = 2;
        twoArray[6][7] = 3;
        System.out.println("源陣列");
        showArray(twoArray);

        int[][] sparseArray = twoArrayToSparseArray(twoArray);
        System.out.println("稀疏陣列");
        showArray(sparseArray);

        int[][] twoArray2 = sparseArrayToTwoArray(sparseArray);
        System.out.println("稀疏陣列轉源陣列");
        showArray(twoArray2);
    }

    public static int[][] twoArrayToSparseArray(int[][] twoArray) {
        int count = 0;
        for (int i = 0; i < twoArray.length; i++) {
            for (int x = 0; x < twoArray[i].length; x++) {
                if (twoArray[i][x] != 0) {
                    count++;
                }
            }
        }

        int line = 1;
        int[][] sparseArray = new int[count + 1][3];
        sparseArray[0][0] = twoArray.length;
        sparseArray[0][1] = twoArray[0].length;
        sparseArray[0][2] = count;

        for (int i = 0; i < twoArray.length; i++) {
            for (int x = 0; x < twoArray[i].length; x++) {
                if (twoArray[i][x] != 0) {
                    sparseArray[line][0] = i;
                    sparseArray[line][1] = x;
                    sparseArray[line][2] = twoArray[i][x];
                    line++;
                }
            }
        }
        return sparseArray;
    }

    public static int[][] sparseArrayToTwoArray(int[][] sparseArray) {
        int line = sparseArray[0][0];
        int row = sparseArray[0][1];
        int[][] twoArray = new int[line][row];
        for (int i = 1; i < sparseArray.length; i++) {
            int line2 = sparseArray[i][0];
            int row2 = sparseArray[i][1];
            int value = sparseArray[i][2];
            twoArray[line2][row2] = value;
        }
        return twoArray;
    }

    public static void showArray(int[][] array) {
        for (int i = 0; i < array.length; i++) {
            for (int x = 0; x < array[i].length; x++) {
                System.out.print(array[i][x] + " ");
            }
            System.out.println();
        }
    }
View Code

 

相關文章