数据结构和算法学习:稀疏数组

稀疏数组

稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组

意义

一个二维数组中有大量位置是空着的,这样存储会浪费很多内存空间,这时可以采用稀疏数组来存储数据,大量减少内存空间。

二维数组

          0 0 0 0 0 0 0 0 0 0 0
          0 0 1 0 0 0 0 0 0 0 0
          0 0 0 0 2 0 0 0 0 0 0
          0 0 0 0 0 0 0 0 0 0 0
          0 0 0 0 0 0 0 0 0 0 0
          0 0 0 0 0 0 0 0 0 0 0
          0 0 0 0 0 0 0 0 0 0 0
          0 0 0 0 0 0 0 0 0 0 0
          0 0 0 0 0 0 0 0 0 0 0
          0 0 0 0 0 0 0 0 0 0 0
          0 0 0 0 0 0 0 0 0 0 0

稀疏数组

          11 11 2
          1  2  1
          2  4  2

使用

遍历二维数组,查找出不是无效数组的元素,已经它的索引,例如上表中的1的存储索引为 arr[1][2],它的值为1。

稀疏数组的第一行是不变的:
[0,0] 代表之前二维数组有多少行
[0,1]代表之前二维数组有多少列
[0,2]代表之前二维数组有多少有效数据

从第二行开始才是存储有效数据的 例如第一个有效数据:
[1,0]代表第一个有效数据存储在二维数组中的行
[1,1]代表第一个有效数据存储在二维数组中的列
[1,2]代表第一个有效数据存储在二维数组中的值

         11 11 2
         1  2  1

二维数组转稀疏数组

public class SparseArray {
    public static void main(String[] args) {
        //定义棋盘(二维数组)
        int[][] chessArr1 = new int[11][11];
        //定义已经下了的棋子
        //0代表还没有下棋,1代表是黑子,2代表是蓝子.
        chessArr1[1][2] = 1;
        chessArr1[2][4] = 2;
        //有效棋子数量
        int count = 0;
        //初始棋盘
        System.out.println("初始棋盘");
        //遍历棋盘
        for(int i = 0 ; i<chessArr1.length;i++){
            for(int j = 0 ; j< chessArr1[i].length;j++){
                if(chessArr1[i][j]!=0){
                    count++;
                }
                System.out.print(chessArr1[i][j]+"\t");
            }
            System.out.println();
        }
        //定义稀疏数组
        int[][] sparseArr1 = new int[count+1][3];
        sparseArr1[0][0] = chessArr1.length;
        sparseArr1[0][1] = chessArr1.length;
        sparseArr1[0][2] = count;
        //将有效数存储到稀疏数组中
        //记住这是第几个数了
        int sum = 0;
        for(int i = 0 ; i<chessArr1.length;i++){
            for(int j = 0 ; j< chessArr1[i].length;j++){
                if(chessArr1[i][j]!=0){
                    ++sum;
                    sparseArr1[sum][0] = i;
                    sparseArr1[sum][1] = j;
                    sparseArr1[sum][2] = chessArr1[i][j] ;
                }
            }
        }
        //稀疏数组
        System.out.println("稀疏数组");
        for(int i = 0 ; i< sparseArr1.length ; i++){
            for(int j = 0 ; j< sparseArr1[i].length ; j++){
                System.out.print(sparseArr1[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

稀疏数组转二维数组

//稀疏数组转二维数组
        //定义一个新的二维数组
        int[][] chessArr2 = new int[11][11];
        for(int i =1;i<sparseArr1.length ; i++){
            chessArr2[sparseArr1[i][0]][sparseArr1[i][1]] = sparseArr1[i][2];
        }

        //遍历新的二维数组
        System.out.println("新的二维数组");
        for(int i = 0; i< chessArr2.length;i++){
            for(int j = 0 ; j< chessArr2[i].length ; j++){
                System.out.print(chessArr2[i][j]+"\t");
            }
            System.out.println();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值