稀疏数组

Posted dabbie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了稀疏数组相关的知识,希望对你有一定的参考价值。

先看一个实际的需求

技术图片

基本介绍

? 1.记录数组一共有几行几列,有几个不同的值

? 2.把具有不同值的元素的行列及值记录在一个小的规模的数组中,从而缩小程序的规模

稀疏数组的处理方法是:

1.记录数组一共有几行几列,有几个不同的值
2.把具有不同值的元素的行列及值记录在一个小的规模的数组中,从而缩小程序的规模

举例说明

技术图片

? 我们可以清楚的看到,数组由原来的6x7,转化为稀疏数组后只有3x8了

应用实例

1.使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
2.把稀疏数组存盘,并且可以从新恢复原来的二维数组数
3.整体思路分析

  • 二维数组换稀疏数组的思路
    1.遍历原始的二维数组,得到有效数据的个数sum
    2.根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
    3.将二维数组的有效数据存入到稀疏数组。
  • 稀疏数组转原始数组的思路
    1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
    2.在读取稀疏数组后几行的数据,并赋给 原始的二维数组即可

代码实现

1.将稀疏数组保存在磁盘上,比如map.data

2.恢复原来的数组时,读取map.data进行恢复。

       //创建原始数组
        int chessArr[][] = new int[11][11];
        /*模拟存储棋盘数据
         *       落子位置:
         *       1:黑子
         *       2:白字
         *       0:没有棋子
         * */
        chessArr[1][2] = 1;
        chessArr[2][3] = 2;
        //展示原始数组
        System.out.println("原始数组:");
        for (int[] row : chessArr) {
            for (int data : row) {
                System.out.printf("%d	",data);
            }
            System.out.println();
        }

        //统计原始数组的有效数据个数
        int sum = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr.length; j++) {
                if (chessArr[i][j]!=0){
                    sum++;
                }
            }
        }

        //创建稀疏数组
        int sparseArr[][] = new int[sum+1][3];
        //初始化稀疏数组
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;

        //将稀疏数组转化为二维数组
        int count = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr.length; j++) {
                if (chessArr[i][j]!=0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr[i][j];
                }
            }
        }
        System.out.println();
        System.out.println("稀疏数组:");

        //打印稀疏数组
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.printf("%d	%d	%d	
",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
        }

        System.out.println("==================================");

        //将二维数组写入文件map.data
        File file = new File("D:\\map.data");
        BufferedWriter bw = new BufferedWriter(new FileWriter(file));
        System.out.println("保存中。。。");
        for (int i = 0; i < sparseArr.length; i++) {
            String data = sparseArr[i][0] + "	" + sparseArr[i][1] + "	" + sparseArr[i][2] + "
";
            bw.write(data);
        }
        bw.close();


        //从硬盘中读取稀疏数组数据
        BufferedReader br = new BufferedReader(new FileReader(file));
        //新建一个数组用来存储读取到的数据
        List<String> list = new ArrayList<>();
        //新建一个字符串来保存读取的每一行
        String line = "";
        while((line = br.readLine())!=null){
            list.add(line);
        }
        br.close();
        //新建一个稀疏数组
        int newSparseArr[][] = new int[list.size()][3];
        for (int i = 0; i < list.size(); i++) {
            //获取原稀疏数组的每一行
            String[] row = list.get(i).split("	");
            //将原稀疏数组的数据赋值给新稀疏数组
            for (int j = 0; j < row.length; j++) {
                newSparseArr[i][j] = Integer.parseInt(row[j]);
            }
        }

        //输出新的稀疏数组:
        System.out.println("读取的稀疏数组:");
        for (int i = 0; i < newSparseArr.length; i++) {
            System.out.printf("%d	%d	%d	
", newSparseArr[i][0], newSparseArr[i][1], newSparseArr[i][2]);
        }
        System.out.println("================================");


        //用新的稀疏数组还原二维数组
        int chessArr2[][] = new int[newSparseArr[0][0]][newSparseArr[0][1]];
        for (int i = 1; i < newSparseArr.length; i++) {
            chessArr2[newSparseArr[i][0]][newSparseArr[i][1]] = newSparseArr[i][2];
        }

        //输出二维数组
        System.out.println("还原的二维数组:");
        for (int[] row : chessArr2) {
            for (int data : row) {
                System.out.printf("%d	",data);
            }
            System.out.println();
        }








以上是关于稀疏数组的主要内容,如果未能解决你的问题,请参考以下文章

稀疏数组

稀疏数组

数据结构稀疏数组 --- 应用场景,转换的思路分析,代码实现

数据结构与算法—稀疏数组和队列

稀疏数组

java数据结构与算法:稀疏数组的讲解运用