java数据结构之稀疏数组

一:什么是稀疏数组?

       稀疏数组说到底也是一种数组,只不过它表示的是对另一个数组数据的一种特殊表示。所谓的特殊表示就是把一个数组中的行数、列数、对应的具体的数值这三个值记录在另一个数组中,从而缩小了数组的规模。这样的被缩小规模后的数组成为稀疏数组。如图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YGH6Iul54ix5pyJ5aSp5oSP,size_10,color_FFFFFF,t_70,g_se,x_16

 

二:为什么需要稀疏数组?

       为了节省内存节省资源,因此我们需要稀疏数组。

三:什么时候用稀疏数组?

       当一个数组中大多数元素为同一个值的时候,那么这个数组中大多数具有相同值得元素我们一定要一一存储吗?这样做岂不是大大的浪费了空间。这个时候我们可以使用稀疏数组。

下面我们来具体看看稀疏数组的实用:

第一种:两二维数组转化为稀疏数组

       1.遍历原始的数组,得到有效数据的个数sum;

        2.根据sum的值创建稀疏数组int[sum+1][3](这里之所以sum+1,是因为我们的稀疏数组的第一行需要存储整个数组的信息,后面的行才记录原始数组的具体信息);

       3.将二维数组的有效数据存入到稀疏数组中。

 

上代码:

首先定义二维数组:

 chessArray[1][2] = 1;

        chessArray[2][3] = 2;

        //遍历输出二维数组

        System.out.println("原始的二维数组为:");

        for(int[] arr : chessArray){

            for(int date : arr){

                System.out.printf("%d ",date);

            }

            System.out.println();

        }

这是打印的结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YGH6Iul54ix5pyJ5aSp5oSP,size_10,color_FFFFFF,t_70,g_se,x_16

 然后我们需要得到有效数据的个数并创建稀疏数组

 //二维数组转为稀疏数组

        //1.将二维数组遍历,得到非0数据的个数sum

        //2.根据sum的值创建稀疏数组

        //3.将二维数组的有效值存入稀疏数组中

        int sum = 0;

        for(int[] arr : chessArray){

            for(int date : arr){

                if(date != 0)

                    sum++;

            }

        }

        System.out.println("sum=" + sum);

        //创建稀疏数组

        int[][] spareseArray = new int[sum + 1][3];

        //给稀疏数组赋值

        spareseArray[0][0] = 11;                      spareseArray[0][1] =11;                        spareseArray[0][2] = sum;       

 //遍历二维数组,将非0的值存入稀疏数组

        int count = 0;//定义count,用于记录当前是第几个非0的数据

        for(int i = 0;i < 11;i++){

            for(int j = 0;j < 11;j++){

                if(chessArray[i][j] != 0){

                    count++;

                    spareseArray[count][0] = i; //存放非0数据所在的行

                    spareseArray[count][1] = j; //存放非0数据所在的列

                    spareseArray[count][2] = chessArray[i][j];//存放非0数据的值

                }

            }

        }

//稀疏数组的输出

        System.out.println();

 

        System.out.println("行 列 值");

        for(int[] arr : spareseArray){

            for(int date : arr){

                System.out.printf("%-2d ",date);

            }

            System.out.println();

        }

看完了二维数组转化为稀疏数组,我们也可以试着将稀疏数组转化为二维数组

1:先读取稀疏数组的第一行,根据读取的结果来创建二维数组

2:再读取后面的数据,将其复制给二维数组即可

上代码

//将稀疏数组恢复成二维数组

        //1.先读取稀疏数组的第一行,创建二维数组

        //2.在读取后面的行的数据,赋值给二维数组

        int[][] arr2 = new int[spareseArray[0][0]][spareseArray[0][1]];

        for(int i = 1; i < spareseArray.length;i++){

            arr2[spareseArray[i][0]][spareseArray[i][1]] = spareseArray[i][2];

        }

        System.out.println("恢复后的二维数组为:");

        for(int[] arr : arr2){

            for(int date : arr){

                System.out.printf("%d ",date);

            }

            System.out.println();

        }

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假若爱有天意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值