稀疏数组(Sparse Array)学习笔记

JAVA学习网 2020-08-19 09:36:05

稀疏数组(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();
		}

	}

}

阅读(2575) 评论(0)