稀疏数组(sparsearray)

1 基本介绍

当一个数组中大部分元素为0或者为同一个值的数组时,可以使用稀疏数组来保存该数组

稀疏数组的处理方法:

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

2 实际需求

  • 编写五子棋程序中,有存盘退出和续上盘的功能
    稀疏数组(sparsearray)_第1张图片
  • 分析问题
    因为该二维数组的很多值是默认值0,因此记录很多没有意义的数据,可以考虑稀疏数组

3 举例说明

稀疏数组(sparsearray)_第2张图片

4 图解转换二者转换思路

稀疏数组(sparsearray)_第3张图片
总结
二维数组 转 稀疏数组的思路
1 遍历原始的二维数组,得到有效数组的个数sum
2 根据sum就可以创建稀疏数组sparsearray int[sum+1][3]
3 将二维数组的有效数据存入到稀疏数组

稀疏数组转原始的二维数组的思路
1 先读取稀疏数组的第一行,根据第一行的数据,创建原始二维数组。比如图中的 chessArr = int[11][11]
2 在读取稀疏数组后几行的数据,并赋值给原始二维数组即可。

5 代码实现

/**
 * 11*11的五子棋
 */
public class SparseArray {
    public static void main(String[] args) {
        //创建一个原始二维数组11*11 0没有棋子 1黑漆 2白棋
        int chessArray[][] = new int[11][11];
        //赋值已经下了的棋 如果没有则全是0
        chessArray[1][2] = 1;
        chessArray[2][3] = 2;
        //chessArray[3][4] = 2;

        System.out.println("输出原始二维数组:");
        for(int[] row: chessArray){
            for (int data: row){
                System.out.print(data + " ");
            }
            System.out.println();
        }

        //二维数组转换为稀疏数组
        //1 遍历原始的二维数组,得到有效数组的个数sum
        int sum  = 0 ;
        for(int i = 0; i < chessArray.length; i++){
            for (int j = 0; j < chessArray.length;j++){
                if(chessArray[i][j]!=0){
                    sum++;
                }
            }
        }
        System.out.println("非0数据sum="+sum);

        //2根据sum就可以创建稀疏数组sparsearray int[sum+1][3]
        int[][] sparseArray = new int[sum+1][3];
        //第一行赋值
        sparseArray[0][0] = 11;
        sparseArray[0][1] = 11;
        sparseArray[0][2] = sum;
        //3 将二维数组的有效数据存入到稀疏数组
        int count = 1;//第一行已经确认;从第二行开始递增
        for(int i = 0; i < chessArray.length; i++){
            for (int j = 0; j < chessArray.length;j++){
                if(chessArray[i][j]!=0){
                    sparseArray[count][0] = i; //确定行数
                    sparseArray[count][1] = j; //确定列数
                    sparseArray[count][2] = chessArray[i][j]; //确定值
                    count++;
                }
            }
        }

        System.out.println("输出转换后的稀疏数组方式1:");
        for(int[] row: sparseArray){
            for (int data: row){
                System.out.print(data + " ");
            }
            System.out.println();
        }

        System.out.println("输出转换后的稀疏数组方式2:");
        for(int i= 0;i< sum+1;i++){
            System.out.print(sparseArray[i][0]+" ");
            System.out.print(sparseArray[i][1]+" ");
            System.out.print(sparseArray[i][2]+" ");
            System.out.println();
        }

        //稀疏数组恢复二维数组
        //先读取稀疏数组的第一行,根据第一行的数据,创建原始二维数组
        int rows = sparseArray[0][0];
        int cols = sparseArray[0][1];
        int copyChessArray[][] = new int[rows][cols];
        for(int i = 0; i < rows; i++){
            for(int j = 0;j < cols; j++){
                copyChessArray[i][j] = 0;
            }
        }
        //在读取稀疏数组后几行的数据,并赋值给原始二维数组即可。
        //从第2行开始 i = 1
        for(int i = 1; i < sparseArray.length; i++){
            //行 列 值
            copyChessArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }

        System.out.println("恢复的二维数组:");
        for(int[] row: chessArray){
            for (int data: row){
                System.out.print(data + " ");
            }
            System.out.println();
        }
    }
}

打印截图
稀疏数组(sparsearray)_第4张图片

6 练习

  • 在前面的基础上,将稀疏数组保存到磁盘上,比如map.data
  • 恢复原来数组时,读取map.data进行恢复(本文恢复成稀疏数组,也可直接恢复成原始二维数组)

代码实现

   System.out.println("练习数据写到磁盘上:");
   try{
       FileWriter fw =  new FileWriter("D:\\data\\map.data");
       for (int i = 0; i < sum+1; i++) {
           fw.write(sparseArray[i][0]+" "+sparseArray[i][1]+" "+sparseArray[i][2]);
           fw.write("\r\n");
       }
       fw.close();
       System.out.println("写成成功!");
   }catch (Exception e){
       e.printStackTrace();
   }

   System.out.println("练习数据从磁盘读出:");
   try{

       BufferedReader br = new BufferedReader(new FileReader("D:\\data\\map.data"));
       String line;
       List<String> list = new ArrayList<>();
       while((line = br.readLine())!=null){
           list.add(line);

       }
       br.close();
       System.out.println("取出成功"+list);
       int arr[][] = new int[list.size()][3];
       for (int i = 0; i < list.size(); i++) {
           String[] split = list.get(i).split(" ");
           arr[i][0] = Integer.parseInt(split[0]);
           arr[i][1] = Integer.parseInt(split[1]);
           arr[i][2] = Integer.parseInt(split[2]);
       }

       System.out.println("输出从磁盘中读取出稀疏数组:");
       for(int i= 0;i<list.size();i++){
           System.out.print(arr[i][0]+" ");
           System.out.print(arr[i][1]+" ");
           System.out.print(arr[i][2]+" ");
           System.out.println();
       }
   }catch (Exception e){
       e.printStackTrace();
   }

磁盘数据
稀疏数组(sparsearray)_第5张图片
打印验证
稀疏数组(sparsearray)_第6张图片

你可能感兴趣的:(数据结构及算法,稀疏编码,java,数据结构,算法)