1. 程式人生 > 實用技巧 >資料結構之稀疏陣列

資料結構之稀疏陣列

我將在實現二維稀疏陣列的基礎上,梳理下稀疏陣列的概念及應用。

1、概念

  其實還是陣列,通過規定,將陣列元素賦予特定含義,將資料量較少,但佔用空間較大的陣列,用較小的儲存空間儲存起來的陣列。

  規定:

    稀疏陣列第一行,第一列,儲存了原陣列的行數

    稀疏陣列第一行,第二列,儲存了原陣列的列數

    稀疏陣列第一行,第三列,儲存了原陣列的元素個數

2、應用舉例

  這裡還是借用網上用的比較多的棋盤儲存來舉例實現。

  在一個10*10的五子棋棋盤上,使用者下了黑色,白色的棋子數枚。

  (1)現需要將當前棋盤進行存檔;

  (2)可以進行讀盤操作恢復當前棋盤。

  程式碼實現如下:

  (1)定義一個二維陣列來模擬棋盤

// 定義一個二維陣列,陣列值為1表示黑子,2表示白子
        int[][] chessAr = new int[10][10];
        chessAr[2][2] = 1;
        chessAr[5][6] = 1;
        chessAr[2][3] = 2;
        chessAr[3][3] = 1;
        chessAr[7][2] = 2;
        chessAr[8][6] = 1;
        for(int[] a : chessAr){
            System.out.println(Arrays.toString(a));
        }

// 列印效果如下 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 1, 2, 0, 0, 0, 0, 0, 0] [0, 0, 0, 1, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 1, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 2, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 1, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

  (2)定義稀疏陣列,模擬存檔情況

        // 計算二維陣列元素個數
        int size = 0;
        for (int
i = 0;i<chessAr.length;i++){ for(int j=0;j<chessAr[i].length;j++){ if (chessAr[i][j] == 1 || chessAr[i][j] == 2){ size++; } } } // 定義一個稀疏陣列 int[][] sparseArray = new int[size+1][3]; sparseArray[0][0] = 10; sparseArray[0][1] = 10; sparseArray[0][2] = size; for(int[] a : sparseArray){ System.out.println(Arrays.toString(a)); } // 稀疏陣列記錄二維資料資訊 int flag = 1; for (int i = 0; i < chessAr.length; i++) { for (int j = 0; j < chessAr[i].length; j++) { if (chessAr[i][j] == 1 || chessAr[i][j] == 2) { sparseArray[flag][0] = i; sparseArray[flag][1] = j; sparseArray[flag][2] = chessAr[i][j]; flag++; } } } System.out.println(); System.out.println(); System.out.println(); for(int[] a : sparseArray){ System.out.println(Arrays.toString(a)); } // 稀疏陣列列印如下 [10, 10, 6] [2, 2, 1] [2, 3, 2] [3, 3, 1] [5, 6, 1] [7, 2, 2] [8, 6, 1]

(3)通過稀疏陣列恢復棋盤

// 定義一個空二維陣列
        int[][] chessArr2 = new int[sparseArray[0][0]][sparseArray[0][1]];
        // 二維資料根據稀疏陣列記錄填充
        for(int i = 1 ;i < sparseArray.length ; i++){
            chessArr2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }
        System.out.println();
        System.out.println();
        System.out.println();
        for(int[] a : chessArr2){
            System.out.println(Arrays.toString(a));
        }

// 列印效果如下
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 2, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 2, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

3、稀疏資料使用注意

  實際開發過程中,一定牢記,我們使用稀疏資料是為了更好的節省系統空間,從而提高效能。

  所以在使用前,需要對容器的資料量進行預估判斷,防止濫用。

  如,10*10的二維陣列,若正常儲存佔用100個元素的空間,與陣列元素值是否有意義無關。

  當其中有33個元素有意義時,使用稀疏陣列儲存,則佔用空間為33*3+3 = 102,此時,使用稀疏素組反而不合適。