连载别人整理的优秀文章数据结构与算法-java实现

java数据结构之稀疏数组

2019-06-04  本文已影响3人  先生zeng

今天学习了数组中的一种-叫做稀疏数组。
什么叫稀疏数组呢?
如果一个数组(包括多维数组)中的大部分元素为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,获取我整理的全套笔记。
思想的碰撞最能促进技术的进步哦。

上一篇 下一篇

猜你喜欢

热点阅读