稀疏数组(Sparse Array)学习笔记


稀疏数组(Sparse Array)

实际案例

五子棋小游戏中实现存盘功能。棋盘用二维数组表示,以0作为空落棋点,1为白棋,2为黑棋。

因为该二维数组很多值是默认值0,因此记录了许多没有意义的数据,保存棋盘时就使用稀疏数组来压缩存储。

稀疏数组介绍

当一个数组中大部分元素为同一个值时,可以使用稀疏数组来保存该数组。

处理方法

  • 记录数组一共有几行几列,有多少个不同的值。

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

代码实现

package com.sparseArray;
/*稀疏数组实例
 * 1.创建一个11*11的五子棋棋盘
 * 2.给[1][2]和[2][3]处分别赋值1,2
 * 3.将棋盘转化为稀疏数组存储
 * */
public class SparseArray {

    public static void main(String[] args) {
        //棋盘默认值为0,用1来表示白棋,2表示黑棋
        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;

        System.out.println("原始的二位数组:");
        for(int[] row : chessArr1) {
            for(int data : row) {
                System.out.printf("%d\t" , data);
            }
            System.out.println();
        }

        //遍历原始数组得到非零元素个数
        int sum = 0;
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1.length; j++) {
                if(chessArr1[i][j] != 0)
                    sum++;
            }
        }

        //创建稀疏数组
        int sparseArr[][] = new int[sum+1][3];
        //稀疏数组第一行存储原始数组行数、列数、非零元素个数
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
        //遍历原始数组非零元素并填充到稀疏数组中
        int cnt = 0;
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1.length; j++) {
                if(chessArr1[i][j] != 0) {
                    cnt++;
                    sparseArr[cnt][0] = i;
                    sparseArr[cnt][1] = j;
                    sparseArr[cnt][2] = chessArr1[i][j];
                }
            }
        }
        //输出稀疏数组
        System.out.println();
        System.out.println("稀疏数组:");
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
        }

        //恢复原始数组
        //1.读取稀疏数组的第一行第一列数据
        int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
        //2.读取稀疏数组中有效数据
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        //3.输出恢复数组
        System.out.println();
        System.out.println("恢复后的数组:");
        for (int i = 0; i < chessArr2.length; i++) {
            for (int j = 0; j < chessArr2.length; j++) {
                System.out.printf("%d\t",chessArr2[i][j]);
            }
            System.out.println();
        }

    }

}


原文链接:https://www.cnblogs.com/Vergissmechnicht/p/13522863.html