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数据结构之稀疏数组

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