数据结构笔记-稀疏数组(应用场景 / 与二维数组的转换 / JAVA代码实现)
;
稀疏数组:
需求: 当一个二维数组的大部分值相同时,可以用稀疏数组来保存数据。
实现: 稀疏数组的三列值分别记录,行 / 列 / 值, 对应二维数组中的每个不同的值,第一行记录该二维数组的大小和有效数据的个数。
应用场景: 棋类游戏用来储存棋子的位置,比如五子棋盘上的黑白棋位置,用来保存当前棋盘的数据。
;
;
二维数组的原始数据,转换为稀疏数组如下图:
;
;
二维数组转稀疏数组的步骤:
- 1.遍历原始数据(二维数组),得到有效数据的个数sum;
- 2.根据sum可以创建稀疏数组sparseArr :int[sum + 1][3];
- 3.将二维数组中的有效数据存入到稀疏数组;
Java 代码实现:
public static void parseSparseArr(int[][] chessArr) {
//遍历二维数组,得到非零值的个数sum
int sum = 0;
for(int[] row : chessArr) {
for(int data : row) {
if(data != 0) {
sum++;
}
}
}
System.out.println("------------------------------------------------");
System.out.println("there are " + sum + " value(s) in this 2D array.");
System.out.println("------------------------------------------------");
//创建稀疏数组
int[][] sparseArr = new int[sum + 1][3];
//将有效数组存入到稀疏数组
sparseArr[0][0] = chessArr.length;
sparseArr[0][1] = chessArr[0].length;
sparseArr[0][2] = sum;
int tempNum = 0;
for(int i = 0; i < chessArr.length; i++) {
for(int j = 0; j < chessArr[i].length; j++) {
if(chessArr[i][j] != 0) {
sparseArr[++tempNum][0] = i;
sparseArr[tempNum][1] = j;
sparseArr[tempNum][2] = chessArr[i][j];
}
}
}
for(int row = 0 ; row < sparseArr.length; row++) {
System.out.printf("%d\t%d\t%d\n",sparseArr[row][0],sparseArr[row][1],sparseArr[row][2]);
}
System.out.println("------------------------------------------------");
}
;
稀疏数组转二维数组的步骤:
- 1.遍历稀疏数组的第一行,得到二维数组的尺寸,创建二维数组 2DArr : int[sparseArr[0][0]][sparseArr[0][1]];
- 2.遍历稀疏数组剩下的数据行,将有效值输入该二维数组;
public static int[][] parse2DArr(int[][] sparseArr){
System.out.println("------------------------------------------------");
//遍历稀疏数组的第一行,得到二维数组的尺寸,创建二维数组
int[][] chessArr = new int[sparseArr[0][0]][sparseArr[0][1]];
//遍历剩下的数据行,将有效值输入该二维数组
for(int i = 0; i < sparseArr[0][2]; i++) {
chessArr[sparseArr[i + 1][0]][sparseArr[i + 1][1]] = sparseArr[i + 1][2];
}
//输出二维数组
for(int[] row : chessArr) {
for(int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
System.out.println("------------------------------------------------");
return chessArr;
}