数据结构

153 阅读2分钟

关于稀疏数组的的一些思考

1.什么是稀疏数组?

当一个二维数组有大量相同的值(比如0,为什么是0呢,因为我们创建出来的int数组默认值为0,存储了很多没有意义的值)的时候,可以转换成稀疏数组来存储,可以大量节省存储空间,例如一个11*11的二维数组甚至可以转换成一个1*1的稀疏数组

2.稀疏数组的实现思路?

计算出远二维数组的行数、列数、不同数值的个数,对应稀疏数组(列数为3)中第一行第一列放行数,第一行第二列放列数、第一行第三列放不同值的个数,复原时根据稀疏数组中存储的值,构建出原二维数组即可。

思考:若果大量重复的值不是0,而是其他值呢?

我们可以在稀疏数组的第一行第三列存储这个大量重复的值,
在复原会原始数组时,可以将没有填充特殊值的位置都设置为这个大量重复的值

3.优点

缩小数据的规模,压缩数据,比如五子棋盘、地图,大量的无意义数值导致数组规模过大,改用稀疏数组存储的话,可以大量节省空间。

4.原始二维数组与对应稀疏数组对比:可见规模缩小了3倍左右

5.代码实现-可运行

    import java.io.*;
    public static void main(String[] args) {
        int chessArr[][] = new int[11][11];
        chessArr[1][2] = 2;
        chessArr[6][8] = 6;
        for (int rowArr[] : chessArr){
            for (int num : rowArr){
                System.out.print(num + " ");
            }
            System.out.print("\n");
        }
        //计算总行数 总列数  总共有多少不同的值
        int col = 0;
        int row = 0;
        int numOfdiffInt = 0;
        for (int a[] : chessArr){
            row++;
            if (col == 0){
                for (int tmp : a){
                    col++;
                }
            }
            for (int tmp : a){
                if ( 0 != tmp){
                    numOfdiffInt++;
                }
            }
        }
        int parseArr[][] = new int[numOfdiffInt + 1][3];
        //将不同的值写入稀疏数组
        int t = 0;
        int num2 = 0;
        for (int bb[] : chessArr){
            for (int i = 0 ; i < col; i ++){
                if ( 0 != bb[i]){
                    num2++;
                    parseArr[num2][0] = t;
                    parseArr[num2][1] = i;
                    parseArr[num2][2] = bb[i];
                }
            }
            t++;
        }
        parseArr[0][2] = numOfdiffInt;
        parseArr[0][0] = row;
        parseArr[0][1] = col;

        System.out.print("打印稀疏数组*****************\n");
        for (int aa[] : parseArr){
            for (int tmp : aa){
                System.out.print(tmp + " ");
            }
            System.out.print("\n");
        }
       //练习写文件操作,将转换出的稀疏数组存入文件中
        File file = new File("/Users/11085347/Desktop/sparseArr.txt");
        try {
            file.delete();
            file.createNewFile();
            BufferedWriter writer = new BufferedWriter(new FileWriter(file));
            for (int write[] : parseArr){
                String tmpWrite = "";
                for (int tmp: write){
                    tmpWrite += tmp + ",";
                }
                tmpWrite = tmpWrite.substring(0,tmpWrite.lastIndexOf(",")  );
                tmpWrite += "\r\n";
                writer.write(tmpWrite);
            }
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
         //取出文件中的稀疏数组
        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            InputStreamReader reader  = new InputStreamReader(fileInputStream);
            BufferedReader bufferedReader = new BufferedReader(reader);
            String line = bufferedReader.readLine();
            while (line != null){
                System.out.println(bufferedReader.readLine());
                line = bufferedReader.readLine();
            }
        } catch (Exception e){
            System.out.print(e);
        }

        //将稀疏数组转为原来数组
        System.out.print("*****************\n");
        int originRow = parseArr[0][0];
        int originCol = parseArr[0][1];
        int originArr[][] = new int[originRow][originCol];
        for (int i = 1 ; i <= parseArr[0][2] ; i++){
            int indexRow = parseArr[i][0];
            int indexCol = parseArr[i][1];
            int value  = parseArr[i][2];
            originArr[indexRow][indexCol] = value;
        }

        for (int a[] : originArr){
            for (int b : a){
                System.out.print(b + " ");
            }
            System.out.print("\n");
        }
    }