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