大数据-快读

  在数据量很大并导致代码超时或读入影响总时间复杂度时,会使用快读。

  思路:将所输入数据看做一个一个字符即字符串,在输入(标准输入或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;

 }

  

猜你喜欢

转载自www.cnblogs.com/fseject-2002/p/9220500.html