資料結構之稀疏陣列
阿新 • • 發佈:2020-08-18
我將在實現二維稀疏陣列的基礎上,梳理下稀疏陣列的概念及應用。
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 (inti = 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,此時,使用稀疏素組反而不合適。