数组

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

posted @   Lz_蚂蚱  阅读(27)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起