zoukankan      html  css  js  c++  java
  • OI黑科技:读入优化

    利用getchar()函数加速读入。
    Q:读入优化是什么?
    A :更加快速地读入一些较大的数字。
    Q:scanf不是已经够快了吗?
    A:Naive,scanf还是不!够!快!
    Q:那怎么办呢?
    A:我们需要大杀器——读入优化!
     
    读入优化非常充分地运用了getchar()函数的特性——快,把数字当成字符读入,处理起来就比较快了。读入的数据达到10^5规模以上时,cin和scanf就会开始显现劣势,但读入优化函数仍能非常快速地读入。
    其实读入优化有好多版本。我这个是夏令营gty哥哥版本的读入优化。从网上找到的读入优化基本上都是与这个大同小异。
           
     1 inline int read(){
     2     int num = 0;
     3     char c;
     4     bool flag = false;
     5     while ((c = getchar()) == ' ' || c == '
    ' || c == '
    ');
     6     if (c == '-')
     7         flag = true;
     8     else
     9         num = c - '0';
    10     while (isdigit(c = getchar()))
    11         num = num * 10 + c - '0';
    12     return (flag ? -1 : 1) * num;
    13 }

    这个isdigit函数存在于cctype头文件下,如果输入的是一个数字,则它返回true。

    还有一个版本的读入优化是不用这个isdigit函数的,它直接用if进行判定,这样也是可以的,读者不妨一试。

    这两个函数里都使用了关键字inline。它代表这是一个“内联函数”。把一个函数声明为内联函数可以提高函数的执行效率,它省去了函数调用的额外开销。
    但是我们不能因为此特性而去大幅使用内联函数。在有些时候,内联函数不仅不会提高效率,反而会严重影响效率。这多半是因为函数内代码比较多,导致内存使用较多(内联函数以内存使用较多为代价)。
    flag用来判断负数,很好理解。
     
    每次输入一个数字都把它转化一下,把之前的数乘10,相当于都往上移了一位,那么就给新进来的这一位提供了空间。
    最后返回这个转化的数即可。
     
    今天已经太晚了。。我有时间的话会自己搞一次cin,scnaf和读优的性能测试,用数据说话才更有说服力嘛。。。
     
    一切无法杀死我的,都将使我变得更加强大。
  • 相关阅读:
    android个人中心界面
    开课第十二周周总结
    android----从相册中选择照片
    《程序员修炼之道:从小工到专家》 阅读笔记
    android----pull解析方式
    开课第十一周周总结
    解决数据库连接时区的问题
    实现数组中连续子数组值和最大
    开课第十周周总结
    解 idea(.IntelliJIdea2019.3)双击打不开的原因
  • 原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7277478.html
Copyright © 2011-2022 走看看