牛骨文教育服务平台(让学习变的简单)
博文笔记

避免超时方法二 :优化数据输入,浅谈getchar,cin,scanf,fread

创建时间:2016-04-17 投稿人: 浏览次数:2715

做ACM的题目时候,输入输出是很重要的,特别输入的数字很多的时候,很容易影响整个程序的执行时间,下面浅淡C语言c++的输入。

1.最基础的当然是scanf,这里跟getchar一起讲。我一开始很疑惑,使用scanf ("%s",&s)将一个字符串读入s和用getchar一个一个字符读入有什么区别呢?

在理论上,其实没什么太大的区别,而相比而言,getchar会快一点,这就是输入挂的原理了。

2.其实最主要是想说cin和scanf的比较,cin >> s;看起来真的很方便,不用打格式控制符,也正是因为这一点,每次读入数字或者字符,他都要判断后面那个s是什么类型,在某些题目上面他会变得很容易超时,换成scanf效率大大增加。这样的题目其实不常见,但不代表没有。

3.最大的杀器来了,就是读入文件的fread,这个函数不是一般的快,我看网上别人做得测试,这个可以比scanf快个两秒,scanf比cin快个四秒,当然,这个测试的数据是超级大的,否则不会有这个明显的间隔。


一般用cin和scanf都是不会超时的,我们不应该放太大的精力在这方面上,scanf基本可以做到输入方面不拖后腿了,最重要的还是靠算法里面的优化。

最后的大杀器,输入挂,在输入数据极多的情况下可以有很好的优化效果,这里只给出了int的获取方法。要调用的时候直接在主函数写  a = input(); 即可。


输入挂的代码:(能比scanf还要快,有一道线段树的题目输入十分大,用输入挂能比用scanf快0.1s)

int input()  
{  
    int p = 0, sum = 0, MIN = INF;  
    char ch;  
    ch = getchar();  
    while(1)
    {
    	if(ch == "-" || (ch >= "0" && ch <= "9"))
    		break;
    	ch = getchar();
	}
        
    if(ch == "-")  
    {  
        p = 1;  
        ch = getchar();  
    }  
    while(ch >= "0" && ch <= "9")  
    {  
        sum = sum * 10 + ch - "0";  
        ch = getchar();  
    }  
    return p ? -sum : sum;  
}  
究极读入挂fread
const int MAXSIZE=100000020;
int bufpos;
char buf[MAXSIZE];
void iinit(){
    buf[fread(buf,1,MAXSIZE,stdin)]="";
    bufpos=0;
}
int readint(){
    int val=0;
    for(;buf[bufpos]<"0" || buf[bufpos]>"9";bufpos++);
    for(;buf[bufpos]>="0" && buf[bufpos]<="9" ;bufpos++)
        val=val*10+buf[bufpos]-"0";
    return val;
}

使用fread是先将全部输入直接存到buf这个数组里面,然后使用a = readint()这样的格式提取存进去的整数。

使用fread效率非常高,但是空间花销很大,并不是每道题都适合的。





声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。