大数据-快读
在数据量很大并导致代码超时或读入影响总时间复杂度时,会使用快读。
思路:将所输入数据看做一个一个字符即字符串,在输入(标准输入或fopen)完成之前,从缓冲区读入输入的数据。由于一般的输入(scanf()、cin、getline()等)都是在输入结束后,即缓冲区发现“空”(0、空格、换行符)的时候通过流从缓冲区读取,而getchar()在每个字符进入缓冲区时都会读入,从而可以用getchar()大大提高读入的效率。
代码:
1 void read(int &a){ //对a进行读取 2 int s=0, w=1; 3 char b=getchar(); 4 while(b<'0' || b>'9'){ 5 if(b==‘-’) w=-1; 6 if(b==' ') read(b); 7 if(b==isspace()) read(b);//isspace()为换行符,在WIndows和Lunix下可以通用; 8 } 9 while(b<='9' && b>='0'){ 10 s=10*s+b-'0'; 11 b=getchar(); 12 } 13 a=w*s; 14 return ; 15 } 16 int main(){ 17 int n; 18 cin>>n; 19 for(int i=1;i<=n;i++){ 20 read(a[i]); 21 return 0; 22 }
上述代码虽然从理论上完成了快读,但是由于大量调用函数和递归时的压栈弹栈,还有绝对引用,效率依然不高,可进行一定的优化。
通过使用内联函数inline可使其在预处理时被替换进代码内,避免了调用函数时大量的弹栈压栈,从而提高了效率。其次,使用内联函数的返回值,可以省去绝对引用所占用的时间和内存。此外,将代码中的递归过程能够转化为递推过程,也可以提高效率。
优化代码如下:
1 inline int read(){ 2 int s=0, w=1; 3 char b=getchar(); 4 while(b<'0' || b>'9'){ 5 if(b==‘-’) w=-1; 6 b=getchar(); 7 } 8 while(b<='9' && b>='0'){ 9 s=10*s+b-'0'; 10 b=getchar(); 11 } 12 return w*s; 13 } 14 int main(){ 15 cin>>n; 16 for(int i=1;i<=n;i++) 17 a[i]=read(); 18 return 0; 19 }
posted on 2018-06-24 14:40 legend_noa 阅读(88) 评论(0) 编辑 收藏 举报