zoukankan      html  css  js  c++  java
  • 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;
        }
    
  • 相关阅读:
    20169205 2016-2017-2 《移动平台应用开发实践》第4周学习总结
    20169205 2016-2017-2《网络攻防》第4周总结
    20169205 2016-2017-2 《移动平台应用开发实践》第3周学习总结
    tcpdump使用
    wireshark使用
    20169205 2016-2017-2《网络攻防》第3周总结
    OpenSSH/PuTTY/SSH使用
    Aircrack使用
    Metasploit使用
    20155325 2017-2018 1 《信息安全系统设计基础》 第十周学习总结
  • 原文地址:https://www.cnblogs.com/licsber/p/java_fast_read.html
Copyright © 2011-2022 走看看