数据结构--稀疏数组

目录

1.例子

2.分析问题

3.稀疏数组介绍

稀疏数组存储数据的方法:

图解:

4.使用java代码来实现五子棋的存盘、归档


1.例子

        在玩五子棋的时候,会有一个存盘、恢复棋盘的功能;这个时候我们可以将棋盘存储到一个二维数组当中,表示每个棋子的位置。如下:

        我们使用了0表示空白,1表示黑色棋子,2表示蓝色棋子。这样就将棋盘中棋子的位置转换到了一个数组当中。

2.分析问题

        我们看到上面的二维数组是一个11*11的二维数组,这个二维数组当中存放了太多的相同元素,记录了很多无意义的值。所以我们可以换一种方式来存储,减小数组占用的容量,并且还要保持数据的准确性。这个时候我们就可以使用稀疏数组。

3.稀疏数组介绍

        当一个数组中,大部分的元素为0或者同一个值的时候,可以使用稀疏数组来保存该数组。

稀疏数组存储数据的方法:

  1. 稀疏数组的第一行,记录了原始数组的行数、列数和有效元素的数量。
  2. 把具有不同值的元素的行和列记录在一个小规模的数组中,从而达到缩小程序规模的效果。

图解:

4.使用java代码来实现五子棋的存盘、归档

1.初始化一个二维数组,来表示棋盘

        int array[][] = new int[11][11];

2.给二维数组添加元素,来表示棋子在棋盘上的位置及颜色

        array[1][2] = 1;
        array[2][3] = 2;
        System.out.println("原始数组:");
        for (int[] arr : array){
            System.out.println(Arrays.toString(arr));
        }
        System.out.println("------------原始数组初始化完成,转稀疏数组----------------");

初始化二维数组完成,接下来将二维数组转化成稀疏数组。

3.要转化成稀疏数组,我们要知道二维数组的有效数据的个数,也就是棋子的数量

        int num = 0;
        for (int[] arr : array){
            for (int i : arr){
                if (i != 0) num++;
            }
        }

4.初始化一个二维数组来表述稀疏数组

        int sparse[][] = new int[num+1][3];
        sparse[0][0] = 11;
        sparse[0][1] = 11;
        sparse[0][2] = num;

5.将原始数组的元素信息存储到稀疏数组当中

        int row = 1;
        for(int i = 0 ; i < array.length ; i++){
            for(int j = 0 ; j < array[i].length ; j++){
                if (array[i][j] != 0){
                    sparse[row][0] = i;
                    sparse[row][1] = j;
                    sparse[row][2] = array[i][j];
                    row++;
                }
            }
        }
        System.out.println("输出稀疏数组:");
        for (int[] sp : sparse){
            System.out.println(Arrays.toString(sp));
        }
        System.out.println("--------------转换稀疏数组完成,还原二维数组------------------");

转换稀疏数组就完成了,也就是我们已经将棋盘进行存档。

接下来我们要进行归档,也就是将稀疏数组还原成原始的二维数组。

6.初始化一个二维数组

        int source[][] = new int[sparse[0][0]][sparse[0][1]];
        int sum = sparse[0][2];

7.将稀疏数组的数据,写入到二维数组当中

        for(int i = 1 ; i <= sum ; i++){
            source[sparse[i][0]][sparse[i][1]] = sparse[i][2];
        }
        System.out.println("还原后的数组:");
        for (int[] sou : source){
            System.out.println(Arrays.toString(sou));
        }
        System.out.println("--------------稀疏数组还原完成------------------");

这样我们就简单的完成了棋盘的存档与归档。

我们来看看控制台的输出吧。

原始数组:
[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, 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, 0]
------------原始数组初始化完成,转稀疏数组----------------
输出稀疏数组:
[11, 11, 2]
[1, 2, 1]
[2, 3, 2]
--------------转换稀疏数组完成,还原二维数组------------------
还原后的数组:
[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, 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, 0]
--------------稀疏数组还原完成------------------

Process finished with exit code 0

        以上是关于稀疏数组的简单小案例,如有不严谨的地方,麻烦各位大佬评论或私信支教,还请不吝赐教,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值