• Java OJ 快速读入 竞赛用


    背景

    Java打比赛太吃亏了吧
    人家C艹有超快的getchar()
    最不济cin的效率也比Java带的Scanner高
    还有内存占用方面
    竞赛中都不计算Java的内存占用
    因为占用太多了( 在空间上卡Java一卡一个准

    结论

    利用读入二维数组进行测试:

    用StreamTokenizer是最快的方法

    代码如下:

    public class TokenRead {
        public static int[][] bufferedRead() throws IOException {
            StreamTokenizer scanner = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    
            scanner.nextToken();
            long initTime = System.currentTimeMillis();
            int n = (int) scanner.nval;
            int[][] all = new int[n][];
    
            for (int i = 0; i < n; i++) {
                scanner.nextToken();
                int count = (int) scanner.nval;
                all[i] = new int[count];
                for (int j = 0; j < count; j++) {
                    scanner.nextToken();
                    all[i][j] = (int) scanner.nval;
                }
            }
    
            long nowTime = System.currentTimeMillis();
            System.out.println((nowTime - initTime));
            return all;
        }
    

    大概是其他读入方法的数量级的差距

    对比算法1:

        public static int[][] bufferedRead(String input) {
            Scanner scanner = new Scanner(new BufferedInputStream(System.in));
            scanner = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
    
            int n = scanner.nextInt();
            long initTime = System.currentTimeMillis();
            int[][] all = new int[n][];
            for (int i = 0; i < n; i++) {
                int num = scanner.nextInt();
                all[i] = new int[num];
                for (int j = 0; j < num; j++) {
                    int value = scanner.nextInt();
                    all[i][j] = value;
                }
            }
            long nowTime = System.currentTimeMillis();
            System.out.println((nowTime - initTime));
            return all;
        }
    

    对比算法2:

        public static int[][] lineRead(String input) {
            Scanner scanner = new Scanner(new BufferedInputStream(System.in));
    
            int n = scanner.nextInt();
            long initTime = System.currentTimeMillis();
            scanner.nextLine();
    
            int[][] all = new int[n][];
            for (int i = 0; i < n; i++) {
                String num = scanner.nextLine();
                String[] nums = num.split(" ");
                int len = Integer.parseInt(nums[0]);
                all[i] = new int[len];
                for (int j = 0; j < len; j++) {
                    all[i][j] = Integer.parseInt(nums[j + 1]);
                }
            }
    
            long nowTime = System.currentTimeMillis();
            System.out.println((nowTime - initTime));
            return all;
        }
    

    对比算法3:

        public static int[][] forceRead(String input) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            long initTime = System.currentTimeMillis();
    
            int[][] all = new int[n][];
            for (int i = 0; i < n; i++) {
                int num = scanner.nextInt();
                all[i] = new int[num];
                for (int j = 0; j < num; j++) {
                    int value = scanner.nextInt();
                    all[i][j] = value;
                }
            }
            long nowTime = System.currentTimeMillis();
            System.out.println((nowTime - initTime));
            return all;
        }
    
  • 相关阅读:
    第几天
    计算一个歌手的平均分
    将单词的首字母改为大写
    两数求和
    做一板1寸照片
    Filter过滤器
    AJAX
    EL表达式
    session存取
    默认的前进,刷新,后退,代码
  • 原文地址:https://www.cnblogs.com/licsber/p/java_fast_read.html
Copyright © 2020-2023  润新知