数组
稀疏数组(sparsearray)
应用场景
先看一个实际的需求
- 编写的五子棋程序中,有存盘退出和续上盘的功能。
- 分析问题:
因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据 -> 稀疏数组。
基本介绍
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
1)记录数组一共有几行几列,有多少个不同的值
2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
二维数组 转 稀疏数组的思路:
1.遍历 原始的二维数组,得到有效数据的个数 sum
2.根据sum 就可以创建 稀疏数组
sparseArr int[sum + 1] [3]
3.将二维数组的有效数据数据存入到 稀疏数组
稀疏数组转原始的二维数组的思路:
1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,
比如上面的
chessArr2 = int [11][11]
2.在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可
应用实例
1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
2)把稀疏数组存盘,并且可以从新恢复原来的二维数组数
代码实现
package sparsearray;
/**
* 稀疏数组
* <p>
* 思想:
* 由二维数组转换为稀疏数组:
* 1、记录二维数组整体结构(row,col),及数组中不同元素的个数
* 2、记录每行元素位置及存储的值
* <p>
* 由稀疏数组转换为二位数组:
* 1、根据稀疏数组记录的二位数组的结构恢复原数据结构(row,col)
* 2、根据每行记录的位置及保存的值,恢复原元素位置和值
*
* @author leizi
* @create 2022-05-29 12:06
*/
public class SparseArray {
public static void main(String[] args) {
int[][] arr = new int[6][7];
arr[0][3] = 22;
arr[0][6] = 15;
arr[1][1] = 11;
arr[1][5] = 17;
arr[2][3] = -6;
arr[3][6] = 39;
arr[4][0] = 91;
arr[5][2] = 28;
int[][] sparseArr = twoDimensionalArrayToSparsArray(arr);
for (int i = 0; i < sparseArr.length; i++) {
System.out.print("[" + i + "] ");
for (int j = 0; j < sparseArr[0].length; j++) {
System.out.print(sparseArr[i][j] + "|");
}
System.out.println();
}
}
/**
* 二维数组转稀疏数组
*
* @param arr 二维数组
*/
public static int[][] twoDimensionalArrayToSparsArray(int[][] arr) {
// 查看二维数组结构和不同元素个数
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (0 != arr[i][j]) {
++count;
}
}
}
// 定义稀疏数组3列保存row|col|value
int[][] sparsArr = new int[count + 1][3];
// 稀疏数组元素0记录二维数组结构
sparsArr[0] = new int[]{arr.length, arr[0].length, count};
int num = 1;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (0 != arr[i][j] && num <= count) {
sparsArr[num] = new int[]{i, j, arr[i][j]};
num++;
}
}
}
return sparsArr;
}
}
本文来自博客园,作者:Lz_蚂蚱,转载请注明原文链接:https://www.cnblogs.com/leizia/p/16633715.html