java数据结构之稀疏数组

作者: 先生zeng | 来源:发表于2019-06-04 00:04 被阅读3次

今天学习了数组中的一种-叫做稀疏数组。
什么叫稀疏数组呢?
如果一个数组(包括多维数组)中的大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组,节约空间。
一般来说,稀疏数组的处理方法是:
1.记录数组一共有几行几列,有多少个不同的数值。
2.把具有不同值的元素的行列及记录在一个小规模的数组中,从而缩小程序的规模。
如图所示,一般来说,第一行存取几行几列以及几个数值。


image.png

应用:

  1. 可以使用稀疏数组来保留类似前面的二维数组(棋盘,地图等)
    2.把稀疏数组存盘,并且可以重新恢复原来的二维数组数。

下面将使用一个例子,结合来构建稀疏数组。
在编写的五子棋程序中,有存盘和续上盘的功能。


image.png

由于此时,棋盘中的棋子的坐标符合大多数元素为0的情况,所以我们可以构建一个稀疏数组来表示这道题。
那么我们可以得到二维数组转稀疏数组的思路

  1. 遍历二维数组,得到有效个数sum。
  2. 根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
  3. 将二维数组的有效数据存入稀疏数组。

稀疏数组转原始的二维数组思路:

  1. 先读取稀疏数组的第一行,根据第一行数据,创建原始的二维数组。
  2. 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可。
public class SparsearrayTest {


    public static void main(String[] args) {


    //创建一个原始的二维数组。
    //0代表没有棋子  1.代表黑子   2.蓝子
        int[][] chessArr1 = new int[11][11];

        chessArr1[1][2]=1;
        chessArr1[2][5]=1;
        chessArr1[3][2]=2;
        chessArr1[5][4]=1;
        chessArr1[4][5]=2;
        //输出原始的二位数组
        System.out.println("原始的二维数组为:");
        Arrays.stream(chessArr1).forEach(x -> {
            Arrays.stream(x).forEach(System.out::print);
            System.out.println();
            }
        );

    //将二维数组转化为稀疏数组
    //1,先遍历二维数组,得到非0的数据个数
        int sum=0;
     //   Arrays.stream(chessArr1).forEach(x -> { Arrays.stream(x).filter(y -> y!=0).sum(); });
        for(int i=0;i<11;i++){
            for(int j=0;j<11;j++){
                if(chessArr1[i][j]!=0){
                    sum++;
                }
            }
        }

        System.out.println("有效值个数为:"+sum);
    //2创建对应的稀疏数组
        int[][] sparseArr = new int[sum + 1][3];
        sparseArr[0][0]=11;
        sparseArr[0][1]=11;
        sparseArr[0][2]=sum;
        //3.遍历二维数组,将非0的值存放到sparseArr
        //记录第几个非0的数据
        int count=0;
        for(int i=0;i<11;i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr1[i][j] != 0) {
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                }
            }
        }
    //输出稀疏数组的形式
            System.out.println("");
            System.out.println("稀疏数组形式为-----");
            for(int z=0;z<sparseArr.length;z++){
                System.out.println(sparseArr[z][0]+" "+sparseArr[z][1]+" "+sparseArr[z][2]);
            }
    //将稀疏数组-》转化成原始的二维数组
        /**
         * 1.先读取第一行,根据第一行的数据,创建原始的二位数据,比如上面的chessArr2=int[11][11]
         *
         * 2.在读取稀疏数组后几行的数据,并赋给原始的二维数组
         */
        int[][] chessArry2 = new int[sparseArr[0][0]][sparseArr[0][1]];
        for(int z=1;z<sparseArr.length;z++){
            chessArry2[sparseArr[z][0]][sparseArr[z][1]]=sparseArr[z][2];
        }

        //输出恢复后的二维数组
        Arrays.stream(chessArry2).forEach(x -> {
                    Arrays.stream(x).forEach(System.out::print);
                    System.out.println();
                }
        );
    }
}

结合例子可以更好的理解哦。

感谢您阅读我的文章,如果满意可以帮我点歌赞,谢谢哈。
如果对文章部分还有什么见解或者疑惑,可以私信评论我,欢迎技术讨论。如果需要获取完整的文件资源,可以加我微信z985085305,获取我整理的全套笔记。
思想的碰撞最能促进技术的进步哦。

相关文章

  • java数据结构之稀疏数组

    今天学习了数组中的一种-叫做稀疏数组。什么叫稀疏数组呢?如果一个数组(包括多维数组)中的大部分元素为0,或者为同一...

  • 数据结构之 稀疏数组

    作用 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 实现思路 1)记录数组一...

  • Java数据结构之稀疏数组和队列

    稀疏数组: 应用场景,实际的需求: 编写五子棋程序中,有存档退出和保存上一句的功能。 实现: 用0代表还没有下的位...

  • 数据结构002之稀疏数组

    什么是稀疏数组? 稀疏数组可以看做是对普通数组的压缩,普通数组是指无效数据量远大于有效数据量的数组,为什么要进行压...

  • 二、Java数据结构-稀疏数组(sparsearray)

    什么时候使用稀疏数组 当一个数组中大部分元素为零,或者为用一个数值的时候,可以使用稀疏数组来保存该数组; 稀疏数组...

  • 数组之稀疏数组

    稀疏数组,程序员听了,难道冥冥之中是天意?和头发一样的稀疏。 其实不然,例如:下棋的棋盘(11*11),用二维数组...

  • 数据结构--稀疏数组

    概述 稀疏数组也是一种数组(总是二维的),是一种多维数组的数组压缩技术。比如存在一个的数组,但是数组中只有3个元素...

  • java 稀疏数组运用

    最近工作中用到了稀疏数组,怕忘记了,做下笔记。 稀疏数组含义: 他是一个N行3列的一个数值,当一个二位数组有大部分...

  • Java数据结构与算法分析 | 稀疏数组

    五子棋游戏的存取需求 在介绍稀疏数组前我们先来引入一个需求,下面是一个五子棋的棋盘(15 * 15),玩到中途时想...

  • Java数据结构与算法分析 | 稀疏数组

    GitHub源码分享 项目主页:https://github.com/gozhuyinglong/blog-dem...

网友评论

    本文标题:java数据结构之稀疏数组

    本文链接:https://www.haomeiwen.com/subject/dwtkxctx.html