zoukankan      html  css  js  c++  java
  • RMQ算法

            对于这个算法,是求区间里面的最大最小值,一般思想在区间for循环一遍找,但是访问区间次数多的话,且区间长度太长,这样时间复杂度都会太长,我认为就是做了一个预处理使得访问时间大大减短。

           怎么才能够得到区间的最值?  所以,如预处理区间的最大值,最小值也是类似的。用一个F二维数组F[ i ][ j ] 表示区间以  i  为起点长度为2^j次方 长度的区间的最大值。 这样处理了加入需要求  (a,b) 区间的最大值,因为F数组存最大值的区间长度为1 2 4 8 16 区间长度为2的n次方;比如你所求区间长度为7 你可以找前4个长度的区间与后4个长度的区间求最大值这样就可以得到你想要的区间的最大值。

          那么如何得到 F这个数组?

     1 struct RMQ
     2 {
     3     int dp[MAXN][20];
     4     void init()
     5     {
     6         for(int i=1;i<=n;i++) dp[i][0]=fi[i];
     7         for(int i=1;i<20;i++) 
     8             for(int j=1;j<=n;j++)    
     9                 if(j+(1<<i)-1<=n) dp[j][i]=max(dp[j][i-1],dp[j+(1<<(i-1))][i-1]);
    10     }
    11     int query(int l,int r)
    12     {
    13         if(l>r) return -1;
    14         if(l==r) return fi[l];
    15         int _k=(int)log2(r-l+1);
    16         return max(dp[l][_k],dp[r-(1<<_k)+1][_k]);
    17     }
    18 }rmq;

    这样便得到F数组  比如求   [a,b] 这个区间的最大值,起点是a,长度是b-a+1,因为2^n等于长度 k=(int)log2(b-a+1)这代表的区间长度k的值一定小于区间长度但是一定大于等于区间长度的一半,  所以

    MAX区间(a,b) 等于     Max(F[ a ][ k ] , F[ b-2^k+1 ][ k ]);

           与此类似的最小值与上述方法一样,就不再多说了。

       希望一起共同学习,共同进步。相信努力就一定会有收获




  • 相关阅读:
    【win7】安装开发环境
    【php-fpm】启动PHP报错ERROR: [pool www] cannot get uid for user 'apache'
    【apache2】AH00543: httpd: bad user name apache
    【gedit】 显示行号
    关于golang.org/x包问题
    国内的go get问题的解决
    php7函数,声明,返回值等新特性介绍
    php5.6.x到php7.0.x特性
    PHP5.4.0新特性研究
    【git】如何去解决fatal: refusing to merge unrelated histories
  • 原文地址:https://www.cnblogs.com/coded-ream/p/7208018.html
Copyright © 2011-2022 走看看