大数据-快读
Posted fseject-2002
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据-快读相关的知识,希望对你有一定的参考价值。
在数据量很大并导致代码超时或读入影响总时间复杂度时,会使用快读。
思路:将所输入数据看做一个一个字符即字符串,在输入(标准输入或fopen)完成之前,从缓冲区读入输入的数据。由于一般的输入(scanf()、cin、getline()等)都是在输入结束后,即缓冲区发现“空”(0、空格、换行符)的时候通过流从缓冲区读取,而getchar()在每个字符进入缓冲区时都会读入,从而可以用getchar()大大提高读入的效率。
代码:
void read(int &a){ //对a进行读取
int s=0, w=1;
char b=getchar();
while(b<‘0‘ || b>‘9‘){
if(b==‘-’) w=-1;
if(b==‘ ‘) read(b);
if(b==isspace()) read(b);//isspace()为换行符,在WIndows和Lunix下可以通用;
}
while(b<=‘9‘ && b>=‘0‘){
s=10*s+b-‘0‘;
b=getchar();
}
a=w*s;
return ;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
read(a[i]);
return 0;
}
上述代码虽然从理论上完成了快读,但是由于大量调用函数和递归时的压栈弹栈,还有绝对引用,效率依然不高,可进行一定的优化。
通过使用内联函数inline可使其在预处理时被替换进代码内,避免了调用函数时大量的弹栈压栈,从而提高了效率。其次,使用内联函数的返回值,可以省去绝对引用所占用的时间和内存。此外,将代码中的递归过程能够转化为递推过程,也可以提高效率。
优化代码如下:
void read(){
int s=0, w=1;
char b=getchar();
while(b<‘0‘ || b>‘9‘){
if(b==‘-’) w=-1;
b=getchar();
}
while(b<=‘9‘ && b>=‘0‘){
s=10*s+b-‘0‘;
b=getchar();
}
return w*s;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
a[i]=read;
return 0;
}
以上是关于大数据-快读的主要内容,如果未能解决你的问题,请参考以下文章