zoukankan      html  css  js  c++  java
  • (二)稀疏数组

    1.稀疏 sparsearray 数组

    1.1.先看一个实际的需求

    • 编写的五子棋程序中,有存盘退出和续上盘的功能。

    • 分析问题:
      因为该二维数组的很多值是默认值 0, 因此记录了 很多没有意义的数据-> 稀疏数组

    1.2.基本介绍

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

    稀疏数组的处理方法是:

    1. 记录数组 一共有几行几列,有多少个不同的值
    2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而 缩小程序的规模
    • 稀疏数组举例说明

    1.3.应用实例

    1. 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
    2. 把稀疏数组存盘,并且可以从新恢复原来的二维数组数
    3. 整体思路分析
    4. 代码实现(韩老师代码)
    public class SparseArray {
      public static void main(String[] args) {
        // 创建一个原始的二维数组 11 * 11
        // 0: 表示没有棋子, 1 表示 黑子 2 表蓝子
        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        chessArr1[4][5] = 2;
    
        // 输出原始的二维数组
        System.out.println("原始的二维数组~~");
        for (int[] row : chessArr1) {
          for (int data : row) {
            System.out.printf("%d	", data);
          }
        System.out.println();
        }
    
        // 将二维数组 转 稀疏数组的思
        // 1. 先遍历二维数组 得到非 0 数据的个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
          for (int j = 0; j < 11; j++) {
            if (chessArr1[i][j] != 0) {
              sum++;
            }
          }
        }
    
        // 2. 创建对应的稀疏数组
        int sparseArr[][] = new int[sum + 1][3];
        // 给稀疏数组赋值
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
    
        // 遍历二维数组,将非 0 的值存放到 sparseArr 中
        int count = 0; //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 i = 0; i < sparseArr.length; i++) {
          System.out.printf("%d	%d	%d	
    ", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
        }
        System.out.println();
        //将稀疏数组 --》 恢复成 原始的二维数组
        /*
         * 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int[11][11]
         * 2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
         */
        //1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
        int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
        //2. 在读取稀疏数组后几行的数据(从第二行开始),并赋给 原始的二维数组 即可
        for(int i = 1; i < sparseArr.length; i++) {
          chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
    
        // 输出恢复后的二维数组
        System.out.println();
        System.out.println("恢复后的二维数组");
        for (int[] row : chessArr2) {
          for (int data : row) {
            System.out.printf("%d	", data);
          }
        System.out.println();
        }
      }
    }
    
    1. 代码实现(自己)
    
    import java.io.IOException;
    
    /**
     * 稀疏数组
     */
    public class SparseArrayDemo {
    
        public static void main(String[] args) throws IOException {
            //原始数组
            int[][] originalArray = new int[11][11];
            originalArray[1][2] = 1;
            originalArray[2][3] = 2;
            originalArray[4][5] = 2;
    
            print(originalArray);
            System.out.println("===================");
    
            //转换为稀疏数组
            int effectiveNumber = getEffectiveNumber(originalArray);
            int[][] sparseArray = new int[effectiveNumber + 1][3];
            sparseArray[0][0] = 11;
            sparseArray[0][1] = 11;
            sparseArray[0][2] = effectiveNumber;
    
            originalArray2SparseArray(originalArray, sparseArray);
            print(sparseArray);
    
            System.out.println("===================");
    
            //转换为原始数据
            print(sparseArray2OriginalArray(sparseArray));
    
        }
    
        /**
         * 稀疏数组转换为原始数组
         *
         * @param sparseArray
         */
        public static int[][] sparseArray2OriginalArray(int[][] sparseArray) {
            int[][] originalArray = new int[sparseArray[0][0]][sparseArray[0][1]];
            for (int i = 1; i < sparseArray.length; i++) {
                originalArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
            }
            return originalArray;
        }
    
        /**
         * 原始数组转换为稀疏数组
         *
         * @param originalArray
         * @param sparseArray
         */
        public static void originalArray2SparseArray(int[][] originalArray, int[][] sparseArray) {
            int point = 1;
            for (int i = 0; i < originalArray.length; i++) {
                for (int j = 0; j < originalArray[i].length; j++) {
                    if (originalArray[i][j] != 0) {
                        sparseArray[point][0] = i;
                        sparseArray[point][1] = j;
                        sparseArray[point][2] = originalArray[i][j];
                        point++;
                    }
                }
            }
        }
    
        /**
         * 获取原始数组有效数据数量
         *
         * @param array
         * @return
         */
        public static int getEffectiveNumber(int[][] array) {
            int sum = 0;
            for (int i = 0; i < array.length; i++) {
                for (int j = 0; j < array[i].length; j++) {
                    if (array[i][j] != 0) {
                        sum++;
                    }
                }
            }
            return sum;
        }
    
        /**
         * 打印二维数组
         *
         * @param array
         */
        public static void print(int[][] array) {
            for (int i = 0; i < array.length; i++) {
                for (int j = 0; j < array[i].length; j++) {
                    System.out.print(array[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
    
    
  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/everyingo/p/15000950.html
Copyright © 2011-2022 走看看