◆程序笔记◆◇第三期◇ 读入优化

来源:互联网 发布:光伏数据采集器接法 编辑:程序博客网 时间:2024/06/05 16:39

Lucky_Glass的程序笔记

第三期-读入优化


C++给我们提供了各种各样的读入方法,常见的有 scanf (标准输入)和 cin (流输入)。但是有一些可怕的题——输入高达几万组(ヽ(゚Д゚)ノ),cin已经炸了,不过还可以用ios::sync_with_stdio(false)——关闭流输入输出与标准输入输出的连接——来拯救一下。这样可以达到标准输入输出的速度,but….还有一些更可怕的题——输入数据超过了十万。就算scanf也会超时。
这样如何解决呢?就需要自己写一个读入优化


一、何为读入优化
读入优化是指利用C++的cstdio库中的getchar()函数来优化整数(或实数)的读入速度。那么读入优化究竟是有多快?如下表:

读入规模(整数) 100000 1000000 10000000 读入优化 6ms 45ms 466ms scanf 23ms 184ms 1650ms cin(优化) 56ms 384ms 3752ms

根据此表,我们可以得出尽管读入了一千万个整数,但是时间还不达半秒(ヽ( ̄▽ ̄)ノ),是完全不需要担心超时的。
这里介绍一个计算程序运行时间的方法:用到了ctime里的clock()函数,它返回的是当前的时间。具体的方法是——在你想开始计时的位置,定义一个double的变量t1,初值为clock(),在计时完毕处也定义一个这样的变量t2,则 t2-t1就得到了运行时间,以毫秒为单位
二、 读入优化函数
一般来说,我们习惯把读入优化函数定义为read()。它的返回类型按照读入类型转换。getchar() 是读入一个字符,速度非常快,那么我们就可以把读入数据抽象成一个字符串,则每次读入其中的一个字符,最后的结果的绝对值存在一个变量x中。由于我们只读入整数,数据中无法避免的会有一些间隔字符,在读入之前,我们用一个while循环读入这些字符,直到读入到数字。但是处理负数的话还需要在开头找到’-‘号,所以当读入到负号时,将标记变量f改为1。接下来就只读入数字,当数字读完时退出,每读入一个数字g,则把x改为 x*10+g,也就是将之前读入的数提前,再将个位补为读入的g。最后判断标记变量f,若为true,则返回 -1*x,否则直接返回x。注意读入的数据大小,避免溢出
三、 看看代码吧!

//读入正整数优化int read(){    char ch;ch=getchar();int x=0;    while(ch<'0' || ch>'9') ch=getchar();    while('0'<=ch && ch<='9') x=x*10+ch-'0',ch=getchar();    return x;}

The End

Thanks for reading!

-Lucky_Glass


原创粉丝点击