資料庫週刊31丨openGauss 正式開源;7月資料庫排行榜釋出;浙江移動國產資料庫AntDB遷移;oracle ADG跨版本搭建;PG解決社保問題;mysqlbinlog解析……
阿新 • • 發佈:2020-07-08
稀疏陣列
在矩陣中,若數值為0的元素數目遠遠多於非0元素的數目,並且非0元素分佈沒有規律時,則稱該矩陣為稀疏矩陣;與之相反,若非0元素數目佔大多數時,則稱該矩陣為稠密矩陣。
最常用的稀疏矩陣儲存格式為列壓縮儲存(compressedcolumn storage,CCS) 或行壓縮儲存( ompressedrow storage,CRS)。
-
需求:編寫五子棋遊戲中,有存檔退出和續上盤的功能。
如:黑棋用1代表,白棋用2代表
-
分析問題:因為該二維陣列的很多值是預設值為0,因此記錄了很多沒有意義的資料。
-
解決:稀疏陣列
稀疏陣列介紹
- 當一個數組中大部分元素為0,或者為同一值得陣列時,可以使用稀疏陣列來儲存該陣列。
- 稀疏陣列的處理方式是:
- 記錄陣列一共有幾行幾列,有多少個不同值
- 把具有不同值得元素和行列及值記錄在一個小規模得陣列中,從而縮小程式的規模
- 如下圖:左邊是原始陣列,右邊是稀疏陣列。
用程式碼記錄稀疏陣列及還原
public class ArrayDemo08 { public static void main(String[] args) { //1.建立一個二維陣列 11*11 0:沒有棋子 1:黑棋 2:白棋 int[][] array1 = new int[11][11]; array1[1][2] = 1; array1[2][3] = 2; //輸出原始的陣列 System.out.println("輸出原始的陣列"); for (int[] ints : array1) { for (int anInt : ints) { System.out.print(anInt+"\t"); } System.out.println(); } System.out.println("===================="); //轉換為稀疏陣列儲存 //獲取有效值的個數 int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if (array1[i][j]!=0){ sum++; } } } System.out.println("有效值的個數:" + sum); //2.建立一個稀疏陣列的陣列 int[][] array2 = new int[sum+1][3]; array2[0][0] = 11; array2[0][1] = 11; array2[0][2] = sum; //遍歷二維陣列,將非零的值,存放在稀疏陣列中 int count = 0; for (int i = 0; i < array1.length; i++) { for (int j = 0; j < array1[i].length; j++) { if (array1[i][j]!=0){ count++; array2[count][0] = i; array2[count][1] = j; array2[count][2] = array1[i][j]; } } } //輸出稀疏陣列 System.out.println("稀疏陣列"); for (int i = 0; i < array2.length; i++) { System.out.println(array2[i][0]+"\t" +array2[i][1]+"\t" +array2[i][2]+"\t"); } System.out.println("=============="); System.out.println("還原"); //1.讀取稀疏陣列 int[][] array3 = new int[array2[0][0]][array2[0][1]]; //2.給其中的元素還原它的值 for (int i = 1; i < array2.length; i++) { array3[array2[i][0]][array2[i][1]] = array2[i][2]; } //3.列印 System.out.println("輸出還原的陣列"); for (int[] ints : array3) { for (int anInt : ints) { System.out.print(anInt+"\t"); } System.out.println(); } } }