1. 程式人生 > 實用技巧 >稀疏陣列(Sparse Array)學習筆記

稀疏陣列(Sparse Array)學習筆記

稀疏陣列(Sparse Array)

實際案例

五子棋小遊戲中實現存檔功能。棋盤用二維陣列表示,以0作為空落棋點,1為白棋,2為黑棋。

因為該二維陣列很多值是預設值0,因此記錄了許多沒有意義的資料,儲存棋盤時就使用稀疏陣列來壓縮儲存。

稀疏陣列介紹

當一個數組中大部分元素為同一個值時,可以使用稀疏陣列來儲存該陣列。

處理方法

  • 記錄陣列一共有幾行幾列,有多少個不同的值。

  • 把具有不同值的元素的行列及值記錄在一個小規模的陣列中,從而縮小程式規模。

程式碼實現

package com.sparseArray;
/*稀疏陣列例項
 * 1.建立一個11*11的五子棋棋盤
 * 2.給[1][2]和[2][3]處分別賦值1,2
 * 3.將棋盤轉化為稀疏陣列儲存
 * */
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;
		
		System.out.println("原始的二位陣列:");
		for(int[] row : chessArr1) {
			for(int data : row) {
				System.out.printf("%d\t" , data);
			}
			System.out.println();
		}
		
		//遍歷原始陣列得到非零元素個數
		int sum = 0;
		for (int i = 0; i < chessArr1.length; i++) {
			for (int j = 0; j < chessArr1.length; j++) {
				if(chessArr1[i][j] != 0)
					sum++;
			}
		}
		
		//建立稀疏陣列
		int sparseArr[][] = new int[sum+1][3];
		//稀疏陣列第一行儲存原始陣列行數、列數、非零元素個數
		sparseArr[0][0] = 11;
		sparseArr[0][1] = 11;
		sparseArr[0][2] = sum;
		//遍歷原始陣列非零元素並填充到稀疏陣列中
		int cnt = 0;
		for (int i = 0; i < chessArr1.length; i++) {
			for (int j = 0; j < chessArr1.length; j++) {
				if(chessArr1[i][j] != 0) {
					cnt++;
					sparseArr[cnt][0] = i;
					sparseArr[cnt][1] = j;
					sparseArr[cnt][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\n", sparseArr[i][0],sparseArr[i][1],sparseArr[i][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];
		}
		//3.輸出恢復陣列
		System.out.println();
		System.out.println("恢復後的陣列:");
		for (int i = 0; i < chessArr2.length; i++) {
			for (int j = 0; j < chessArr2.length; j++) {
				System.out.printf("%d\t",chessArr2[i][j]);
			}
			System.out.println();
		}

	}

}