◆程序笔记◆◇第三期◇ 读入优化
2017-10-05 16:53
176 查看
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相关文章推荐
- java性能优化笔记(三)java程序优化
- 笔记:Java程序性能优化
- JDBC基础学习笔记_05_jdbc的程序优化_DTC相关
- java性能优化笔记(三)java程序优化
- 《Java程序性能优化》学习笔记 Ⅱ程序优化
- CUDA学习笔记之程序优化
- 笔记:深入理解JVM 第四部分 程序编译及代码优化 (第10、11章)
- [转载][ABAP] ABAP程序性能优化总结笔记ING
- 《Java程序性能优化》学习笔记 程序优化
- JDBC基础学习笔记_05_jdbc的程序优化_Dao
- java性能优化笔记(三)java程序优化
- Java学习笔记4--程序的进一步优化
- javascript笔记:深入分析javascript里对象的创建(下)---从对象创建到javascript程序优化
- 《Java程序性能优化 让你的Java程序更快、更稳定》阅读笔记
- Java 程序优化知识笔记
- java程序性能优化学习笔记day1
- java性能优化笔记 java程序优化
- 5、深入理解计算机系统笔记:优化程序性能
- CUDA学习笔记之程序优化
- 读入优化新姿势——学习笔记