稀疏数组

稀疏数组

例子:
棋盘用二维数组保存是11×11,稀疏数组是3×3,因此能大幅度节约空间
在这里插入图片描述
稀疏数组的使用原因:如果二维数组内很多值相同,有很多没意义的数据,使用稀疏数组能够大幅度节约空间

操作方法

  1. 记录数组一共有几行几列,有多少个不同的值
  2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

结构说明:第一行的三个代表几行、几列、几个非0数字。第二行以后的即是特殊元素的行、列、值

例如:

3 2 2 //原数组有三行两列两个非0值

0 1 3 //第0行第1列值为3

2 1 1 //第2行第1列值为1

具体的代码实现:
创建一个二维数组:

        //原始的二维数组
        int[][] chess1=new int[11][11];
        chess1[1][2]=5;
        chess1[3][7]=1;
        chess1[4][6]=3;
        chess1[5][5]=3;
        System.out.println("初始的二维数组:");
        for (int[] rows:chess1)
        {
            for (int arr:rows)
            {
                System.out.print(arr+" ");
            }
            System.out.println();
        }

将其转换成稀疏数组:

        //转换成稀疏数组
        //下方代码为检索多少个值非0
        int sum=0;          	//sum值为非0值的个数,等下建立数组要用
        for(int i=0;i<11;i++)
        {
            for(int j=0;j<11;j++)
            {
                if(chess1[i][j]!=0)
                {
                    sum++;
                }
            }
        }
        //下方代码为建立稀疏数组
        int[][] sparcearry=new int[sum+1][3];
        sparcearry[0][0]=11;     //第一行的三个值是已知的
        sparcearry[0][1]=11;
        sparcearry[0][2]=sum;
        int d=0;
        for(int i=0;i<11;i++)
        {
            for(int j=0;j<11;j++)
            {
                if(chess1[i][j]!=0)
                {
                    d++;
                    sparcearry[d][0]=i;    //为稀疏数组赋值
                    sparcearry[d][1]=j;
                    sparcearry[d][2]=chess1[i][j];
                }
            }
        }
        //打印出稀疏数组
        System.out.println("sparcearry数组:");
        for(int i=0;i<sparcearry.length;i++)
        {
            System.out.println(sparcearry[i][0]+" "+sparcearry[i][1]+" "+sparcearry[i][2]);
            System.out.println();
        }

稀疏数组还原成原数组:

        //还原
        System.out.println("还原后的数组:");
        //建立还原后的二维数组
        int[][] chess2=new int[sparcearry[0][0]][sparcearry[0][1]];
        for(int i=1;i<=sparcearry[0][2];i++)
        {
        	//为其赋值
            chess2[sparcearry[i][0]][sparcearry[i][1]]=sparcearry[i][2];
        }
        //输出二维数组
        for (int[] rows:chess2)
        {
            for (int arr:rows)
            {
                System.out.print(arr+" ");
            }
            System.out.println();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值