数据结构——稀疏数组

稀疏数组
一、为什么要使用稀疏数组

当我们存储有大量重复元素的二维数组时,如果使用一般的二维数组就造成有大量重复元素,很浪费空间
例如这个棋盘,如果要记录棋子的位置我们会想到使用二维数组(1代表黑,2代表蓝),当使用普通二维数组时,那些大量重复的0,占用了很大的内存空间。
于是我们就可以使用稀疏数组来存储有效数据
在这里插入图片描述

二、稀疏数组怎么用

在这里插入图片描述

稀疏数组一共有三列(列固定),分别表示行号、列、值

  • 第一行:记录初始数组的行、列、有效值个数
  • 其他行:依次记录有效值的行号、列号、值
  • 稀疏数组总行数为有效值(假设有效值为num)num+1,列数为3
三、代码实现
数组转稀疏思路:
  • 先定义好一个二维数组数组,并赋值
  • 遍历数组,获取有效值个数num
  • 定义稀疏数组,行数为num+1,列数为3,为数组第一行赋值
  • 再次遍历初始数组,获取有效值,赋值给稀疏数组
  • 定义完成
稀疏数组转二维数组:
  • 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
  • 再读取稀疏数组后几行的数据,并赋值给 原始的二维数组 即可
代码
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;
        chessArr1[5][4] = 1;
        for (int[] row : chessArr1) {
            for (int data : row) {
                System.out.print(data + "\t");
            }
            System.out.println();
        }
        //得到稀疏数组
        int[][] sparseArr = toSparseArray(chessArr1);
        //输出稀疏数组的形式
        System.out.println("-----------");
        System.out.println("得到的稀疏数组");
        for (int[] ints : sparseArr) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t ");
            }
            System.out.println();
        }

        System.out.println("-------------");
        System.out.println("恢复后的二维数组");
        //将稀疏数组 恢复成 原始的二维数组
        int[][] chessArr2 = recover(sparseArr);
        for (int[] ints : chessArr2) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }
        /**
     * 将二维数组 转 稀疏数组的思路
     * 1、先遍历二维数组 得到非0数据的个数
     * @param chessArray
     * @return
     */
    public static int[][] toSparseArray(int[][] chessArray){
        //有效数的个数
        int sum = 0;
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray.length;j++) {
                if (chessArray[i][j]!=0) {
                    sum++;
                }
            }
        }
        //2、创建对应的稀疏数组
        int sparseArr[][] = new int[sum+1][3];
        //给稀疏数组赋值
        sparseArr[0][0] = chessArray.length;
        sparseArr[0][1] = chessArray.length;
        sparseArr[0][2] = sum;
        //用于记录是第几个非0数
        int count = 0;
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray.length;j++) {
                if (chessArray[i][j]!=0) {
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] =j;
                    sparseArr[count][2] = chessArray[i][j];
                }
            }
        }
        return sparseArr;
    }

    /**
     * 1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
     * 2、再读取稀疏数组后几行的数据,并赋值给 原始的二维数组 即可
     *
     * @param sparseArr
     * @return
     */
    public static int[][] recover(int[][] sparseArr){
        int row = sparseArr[0][0];
        int col = sparseArr[0][1];
        int validNum = sparseArr[0][2];

        int chessArr2[][] = new int[row][col];
        for (int i = 1;i<sparseArr.length;i++) {
            int chessRow = sparseArr[i][0];
            int chessCol =  sparseArr[i][1];
            int chessVal = sparseArr[i][2];
            chessArr2[chessRow][chessCol] = chessVal;
        }
        return chessArr2;
    }
        
总结

理解稀疏数组的使用场景,理解稀疏数组的定义~
韩顺平老师的数据结构打卡第一天

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值