数组

稀疏数组(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 @ 2022-08-28 21:19  Lz_蚂蚱  阅读(33)  评论(0)    收藏  举报