Java數據結構----稀疏數組

我們先看一個實際的需求:
編寫一個五子棋盤程序,並存在退出後存盤功能和續上盤的功能。
需求模擬圖

解決方案

  • 方案一:將這個棋盤模擬成一個二維數組,將數據存儲起來。
  • 方案二:使用稀疏數組,將棋盤存儲起來,並達到一個數據壓縮的效果。

解決方案優劣勢分析

  • 方案一:
  • 優勢: 簡單方便,代碼簡單。
  • 劣勢: 造成數據冗餘,有很多不必要的數據存儲下來了。
  • 方案二:
  • 優勢:節省儲存空間
  • 劣勢:代碼稍微複雜一些

稀疏數組簡介

在這裏插入圖片描述

代碼實現

public class SparseArray {
	public static void main(String[] args) {
		// 首先我們創建一個存儲有數據的二維數組,6行7列
		int[][] array = new int[6][7];
		// 給數組裏面添加數據
		int[0][2] = 22;
		int[0][6] = 15;
		int[1][1] = 11;
		int[1][5] = 17;
		int[2][3] = -6;
		int[3][5] = 39;
		int[4][0] = 91;
		int[5][2] = 28;
	}

	/**
	* 傳入一個非空大小的二維數組,轉成一個二維的稀疏數組
	*
	* @param 二維數組
	*/
	public int[][] arrayToSparse(int[][] array) {
		// 1. 遍歷數組計算出該數組的有效數據的個數
		int sum = 0;
		for (int i = 0;i < array.length();i++) {
			for (int j = 0;i< array[0].length();j++) {
				if (array[i][j] != 0) {
					sum += 1;
				}
			}
		}

		// 2. 創建一個稀疏數組
		int[][] sparse = int[sum+1][3];

		// 給第一行填充數據
		sparse[0][0] = array.length();
		sparse[0][1] = array[0].length();
		sparse[0][2] = sum;

		// 3. 遍歷數組給稀疏數組填充數據
		int row = 1;
		for (int i = 0;i < array.length();i++) {
			for (int j = 0;i< array[0].length();j++) {
				if (array[i][j] != 0) {
					// 記錄數據行數
					sparse[row][0] = i;
					// 記錄數據列數
					sparse[row][1] = j;
					// 記錄數據
					sparse[row][2] = array[i][j];
					row += 1;
				}
			}
		}

		// 4. 返回稀疏數組
		return sparse;
	}

	/**
	* 將稀疏數組覆盤成爲普通的數組
	* 
	* @param sparse 稀疏數組
	*/
	public int[][] sparseToArray(int[][] sparse) {
		// 1. 創建一個普通的數組
		int[][] array = new int[sparse[0][0]][sparse[0][1]];

		// 2. 遍歷稀疏數組
		for (int i = 1;i < sparse.length();i++) {
			array[sparse[i][0]][sparse[i][1]] = sparse[i][3];
		}
	}
}

代碼寫完了,這種方式儲存數據可以達到壓縮的效果,有人說你的步驟這麼麻煩,還不如直接存起來就行了,其實這是一個用時間換空間的算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章