1. 程式人生 > 實用技巧 >設計實現SAM--無伺服器應用模型

設計實現SAM--無伺服器應用模型

稀疏陣列

引入

需求:在編寫的五子棋(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();
		}


	}
}

 部分執行結果: