稀疏数组

5/12/2023 data-structure

# 1. 稀疏数组

先看一个实际的需求

五子棋程序中,有存盘退出和续上盘的功能。

在这里插入图片描述

分析问题:

因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据.->稀疏数组。

# 1.1 稀疏数组介绍

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组也是一个二维数组,行 取决于有效值的个数+1,列 固定为 3

把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。

稀疏数组的处理方法是:

  • 记录数组一共有几行(i)几列(j),有多少个不同的值(count)。
  • 将 i 存到稀疏数组[0][0]的位置
  • 将 j 存到稀疏数组[0][1]的位置
  • 将 count 存到稀疏数组[0][2]的位置
  • 将各个有效值的行列存到稀疏数组下一行,例如[1][0]=行,[1][1]=列,[1][2]=具体值

示意图

在这里插入图片描述

# 1.2 转换思路

二维数组转稀疏数组的思路:

  • 遍历原始的二维数组,得到有效数据的个数 sum
  • 根据 sum 就可以创建稀疏数组 sparseArr int[sum+1][3]
  • 将二维数组的有效数据数据存入到稀疏数组

稀疏数组转原始的二维数组的思路:

1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 =int[5][6]

2.在读取稀疏数组后几行的数据,并赋给原始的二维数组即可

# 1.3 代码实现

package com.luffy.sparseArray;

import java.util.Arrays;

/**
 * @author dreamLuffe
 * @data 2023/5/11 11:40
 */
@SuppressWarnings("all")
        public class SparseArray {

    public static void main(String[] args) {
        //创建一个原始的而为数组11*11
        //0: 标识没有棋子,1标识黑子 2标识蓝子
        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        //输出原始的二维数组
        System.out.println("原始的二维数组");
        // 打印
        for (int[] row : chessArr1) {
            System.out.println(Arrays.toString(row));
        }
        //转换成稀疏数组
        int[][] sparseArray = toSparseArray(chessArr1);

        //输出稀疏数组的形式
        System.out.println("得到稀疏数组为~~~");
        // 打印
        for (int[] row : sparseArray) {
            System.out.println(Arrays.toString(row));
        }

        //将稀疏数组 ---> 恢复成原始二维数组
        int[][] orginalArray = toOrginalArray(sparseArray);

        //输出稀疏数组的形式
        System.out.println("恢复后的二维数组为");
        // 打印
        for (int[] row : orginalArray) {
            System.out.println(Arrays.toString(row));
        }


    }

    /**
     *  将稀疏数组转换成原始数组
     * @param sparseArray 稀疏数组
     * @return 原始二维数组
     */
    private static int[][] toOrginalArray(int[][] sparseArray) {
        if(sparseArray == null || sparseArray.length == 0){
            throw new IllegalArgumentException("参数异常");
        }
        int[][] orginalArray = new int[sparseArray[0][0]][sparseArray[0][1]];
            for (int i = 1; i < sparseArray.length; i++) {
                orginalArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
            }
        return orginalArray;
    }

    /**
     * 将原始二维数组转换为稀疏数组
     *
     * @param orginalArray 原始二维数组
     * @return 转换后的稀疏数组
     */
    public static int[][] toSparseArray(int[][] orginalArray) {
        if (orginalArray == null || orginalArray.length == 0) {
            throw new IllegalArgumentException("参数异常");
        }
        //遍历数组得到非零总数
        int sum = 0;
        for (int[] row : orginalArray) {
            for (int item : row) {
                if (item != 0) {
                    sum++;
                }
            }
        }
        //创建一个sum+1行 3列的数组(稀疏数组)
        int[][] sparseArray = new int[sum + 1][3];
        //稀疏数组的行
        sparseArray[0][0] = orginalArray.length;
        //稀疏数组的列
        sparseArray[0][1] = orginalArray[0].length;
        //数组中有多少个非零值
        sparseArray[0][2] = sum;

        //遍历二维数组将非0 存放在sparsearr中
        int count = 1;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (orginalArray[i][j] != 0) {
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = orginalArray[i][j];
                    count++;
                }
            }
        }
        return sparseArray;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
Last Updated: 11/10/2023, 11:47:31 PM