zoukankan      html  css  js  c++  java
  • 大数据-快读

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

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

      

  • 相关阅读:
    zabbix监控docker
    Ubuntu下Zabbix结合percona监控mysql数据
    centos7安装ftp
    Ubuntu 16.04 搭建 ELK
    ubuntu网卡配置及安装ssh服务
    CentOS7.5二进制安装MySQL-5.6.40
    生产环境MySQL数据库集群MHA上线实施方案
    Mysql主从复制
    GIt+jenkins代码自动上线
    虚拟机网卡丢失解决方法
  • 原文地址:https://www.cnblogs.com/fseject-2002/p/9220500.html
Copyright © 2011-2022 走看看