数据结构二 稀疏数组

在我们经常下的五子棋当中,通常在程序代码的实现当中,使用二维数组记录黑子和白子的位置,但是问题来了,一般在棋盘中有大量位置,没有被白子和黑子占用,这时使用二维数组来存储,必然会有大量位置没有使用,这样就会白白浪费很多空间,这时就可以使用稀疏数组

稀疏数据的描述

在这里插入图片描述
在这里插入图片描述

二维数组转化为稀疏数组的方法

1.之前已经说过,稀疏数组需要记录二维数组有多少个有效数据,所以第一步需要遍历原二维数组,计算有效数据的位数
2.根据有效数据的位数就可以创建稀疏数组了
3.再重新遍历二维数组,有效数据存储到稀疏数组当中

代码实现

public class Test  {
    public static void main(String[] args) throws InstantiationException,IllegalAccessException {
        //定义原始数组
        int i,j;
        int a[][]=new int[7][8];
        //定义三个非0数据
        a[1][3]=1;
        a[2][4]=8;
        a[5][5]=4;
        //打印原二维数组
        System.out.println("原二维数组为:");
        for(i=0;i<7;++i)
        {
            for(j=0;j<8;++j)
            {
                System.out.print(a[i][j]+"\t");
            }
            System.out.println();
        }
        int sum=0;
        //计算二维数组有效数据有多少个
        for(i=0;i<7;++i)
        {
            for(j=0;j<8;++j)
            {
               if(a[i][j]!=0)
               {
                   sum++;
               }
            }
        }
        System.out.println("总数为"+sum);
        //得到了sum之后,就可以知道稀疏数组有多少行多少列了,由于稀疏数组第一行要专门存储原数组的行列数和元素个数,所以行数为sum加1
        int b[][]=new int[sum+1][3];
        //定义一个count,用来记录当前有效数据是第几个,以便存入到稀疏数组当中
        b[0][0]=7;
        b[0][1]=8;
        b[0][2]=sum;
        int count=0;
        for(i=0;i<7;++i)
        {
            for(j=0;j<8;++j)
            {
                if(a[i][j]!=0)
                {
                    count++;
                    b[count][0]=i;
                    b[count][1]=j;
                    b[count][2]=a[i][j];
                }
            }
        }
        //对得到的稀疏数组进行遍历
        System.out.println("稀疏数组为:");
        for(i=0;i<sum+1;++i)
        {
            for(j=0;j<3;++j)
            {
                System.out.print(b[i][j]+"\t");
            }
            System.out.println();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值