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

做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)]='\0';
    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效率非常高,但是空间花销很大,并不是每道题都适合的。





你可能感兴趣的:(时间复杂度的优化,————零零碎碎————)