設計實現SAM--無伺服器應用模型
阿新 • • 發佈:2020-08-04
稀疏陣列
引入
需求:在編寫的五子棋(11*11的棋盤)程式中,有存檔退出和續上盤的功能。(使用二維陣列記錄棋盤)
對應二維陣列轉換成稀疏陣列
分析問題:
因為該二維陣列的很多預設值是0,因此記錄了很多沒有意義的資料==>稀疏陣列(可以對二維陣列進行壓縮)。其中1是黑子,2是藍色的子。
基本介紹:
當一個數組中大部分元素為0,或者為同一個值的陣列時,可以使用稀疏陣列來儲存該陣列。
稀疏陣列的處理方法是:
1)記錄陣列一共有幾行幾列,有多少個不同的值。
2)把具有不同值的元素的行列及值記錄在一個小規模的陣列(稀疏陣列)中,從而縮小程式的規模。
舉例說明:(以下邊陣列為例)
11*11的陣列 ======> 轉換成了9*3的陣列
二維陣列轉稀疏陣列的思路
1.遍歷原始的二維陣列,得到對應有效資料的個數sum
2.根據sum就可以建立稀疏陣列 int[sum+1][3]
3.將二維陣列的有效資料存入導稀疏陣列
稀疏陣列轉二維陣列的思路
1.先讀取稀疏陣列的第一行資料,建立原始的二維陣列,比如上面的 Arr2=int[11][11]
2.在讀取稀疏陣列的後幾行資料,並賦給原始的二維陣列。
二維陣列與稀疏陣列的轉換程式碼實現(以引入中的例子為例)
package com.atguigu.sparsearray; public class SparseArray { public static void main(String[] args) { //建立一個原始的二維陣列 //0:表示沒有棋子,1表示黑子 2表示藍子 int chessArr1[][]=new int[11][11]; chessArr1[1][2]=1; chessArr1[2][3]=2; //輸出原始的二維陣列 //原始的二維陣列 for(int[] row:chessArr1) { for(int data:row) { System.out.printf("%d\t",data); } System.out.println(); } //二維陣列轉成稀疏陣列 //1.先遍歷二維陣列,得到非零資料的個數 // 方法1 int sum=0; for(int i=0;i<11;i++) { for(int j=0;j<11;j++) { if(chessArr1[i][j]!=0) { sum++; } } } System.out.println("sum="+sum); // 方法2 // int sum1=0; // for(int[] row:chessArr1) { // for(int data:row) { // if(data!=0){ // sum1++; // } // } // } // System.out.println(sum1); //建立對應的稀疏陣列 // 方法1 // int chessArr2[][]=new int[3][3]; // chessArr2[0][0]=11; // chessArr2[0][1]=11; // chessArr2[0][2]=2; // chessArr2[0][0]=11; // chessArr2[1][0]=1; // chessArr2[1][1]=2; // chessArr2[1][2]=1; // chessArr2[2][0]=2; // chessArr2[2][1]=3; // chessArr2[2][2]=2; // for(int[] row:chessArr2) { // for(int data:row) { // System.out.printf("%d\t",data); // } // System.out.println(); // } //方法2 //建立對應的稀疏陣列 int sparseArr[][]=new int[sum+1][3]; //給稀疏陣列賦值 sparseArr[0][0]=11; sparseArr[0][1]=11; sparseArr[0][2]=2; //遍歷二維陣列,將非0的值存放到稀疏陣列sparseArr中 int count=0;//記錄是第幾個非零資料 for(int i=0;i<11;i++) { for(int j=0;j<11;j++) { if(chessArr1[i][j]!=0) { count++; sparseArr[count][0]=i; sparseArr[count][1]=j; sparseArr[count][2]=chessArr1[i][j]; } } } //輸出稀疏陣列的形式 System.out.println(); System.out.println("得到的稀疏陣列為~~~~"); for(int i=0;i<sparseArr.length;i++) { System.out.printf("%d\t%d\t%d\t",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]); System.out.println(); } //將稀疏陣列-->還原成原始的二維陣列 /* 1.先讀取稀疏陣列的第一行資料,建立原始的二維陣列,比如上面的 Arr2=int[11][11] 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(); System.out.println("恢復後的二維陣列"); for(int[] row:chessArr2) { for(int data:row) { System.out.printf("%d\t",data); } System.out.println(); } } }
部分執行結果: