数据结构与算法学习笔记01——稀疏数组

1、稀疏数组

  • 普通数组转换成稀疏数组的方法:

    1. 记录数组共有几行几列,有多少个不同的值 (就是不包括默认值的那些) 分别存入 i、j 、 n
    2. 创建一个对应的n+1 行、 3列的小规模新数组
    3. 小数组第一行存入 i 、 j 、n 。
    4. 剩下n行存入n个需记录的元素的 i,j 下标和值 (3列嘛,依次对应)

    代码示例: 创建了一个二维数组的棋盘 默认棋盘数字为0 然后依次给棋子编号 (比如这里存了两颗棋子 1,2)

    public class SparseArray {
        public static void main(String[] args) {
    
            // 创建原始二维数组
            //0,表示无棋子,1表示有棋子
            int chessArr1[][]= new int[11][11];
            chessArr1[1][2]=1;
            chessArr1[2][3]=2;
            //输出原始数组
            for (int[] row :
                    chessArr1) {
                for (int data :
                        row) {
                    System.out.printf("%d\t",data);
                    
                }
                System.out.println();
                
            }
            //二维数组转转稀疏数组思路
            //1.先遍历二维数组,得到非0数据的个数
            int sum=0;
            for (int i = 0; i < chessArr1.length; i++) {
                for (int j = 0; j < chessArr1[0].length; j++) {
                    if (chessArr1[i][j]!=0){
                        sum++;
                    }
                }
            }
            //2.创建稀疏数组
            int sparseArray[][]=new int[sum+1][3];
            sparseArray[0][0]=11;
            sparseArray[0][1]=11;
            sparseArray[0][2]=sum;
            // 3.遍历二维数组,将非0的值存放到sparseArray
            int count=0;
            for (int i = 0; i < chessArr1.length; i++) {
                for (int j = 0; j < chessArr1[0].length; j++) {
                    if (chessArr1[i][j]!=0){
                        count++;//第二行开始存
                        sparseArray[count][0]=i;
                        sparseArray[count][1]=j;
                        sparseArray[count][2]=chessArr1[i][j];
    
                    }
                }
            }
            System.out.println( );
            System.out.println("稀疏数组为:");
            for (int i = 0; i < sparseArray.length; i++) {
                System.out.printf("%d\t%d\t%d\n", sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
            }
            //恢复成普通二维数组
            //1.读取第一行,创建数组
            //2.读取后几行,给数组赋值
            int  chessArr2[][]=new int [sparseArray[0][0]][sparseArray[0][1]];
            for (int i = 1; i <sparseArray .length ; i++) {
                chessArr2[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
    
            }
            //3.输出恢复后的数组
            for (int[] row :
                    chessArr2) {
                for (int data :
                        row) {
                    System.out.printf("%d\t",data);
    
                }
                System.out.println();
    
            }
    
        }
    }
    
    

    运行结果:

    分析:可以很直观的看到对空间的节省还是很有效的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值