地址:http://blog.csdn.net/z287438743z/article/details/8132806

RMQ(Range Minimum/Maximum Query)问题就是求区间最值问题。这里要仔细分析的是ST算法,它可以做到O(nlogn)的预处理,O(1)回答每个询问。

网上看了好多关于ST算法的文章,还算是有点理解了。

st算法,本质就是一个DP。

有一个数字序列记为L,比如这里给了

1   2   3   4   5   6   7   8   9   10 11 12 13 14 15 16

35 13 65 99 88 75 64 51 42 55 66 83 12 44 65 12

f[i,j]表示的是从i开始的2^j个数里面的最值。以最大值来举例说明。

f[1,0]就是从第一个开始的1个里最大值,那么就是第一个自己本身,f[1,0]=35;

f[2,2]就是从第二个开始的4个里最大值,那么是13,65,99,88里面的最大值,明显是f[2,2]=99;

以此类推。

先前说了,是DP。状态转移方程就是。

f[i,j]=max(f[i,j-1],f[i+2^(j-1),j-1]);

比如f[5,3],包含的值有88 75 64 51 42 55 66 83。

求它的最大值,用二分的思想,就是[88 75 64 51],[42 55 66 83]的最大值中较大的。

即f[5,2] 和 f[9,2]。

以此类推,求i至其后2^j个数的最大值,即把2^j 分成前后两个2^(j-1),分别取其最大值,再通过比较获得此状态最大值。

以上是f数组的构造。

以下才回归到RMQ问题。

貌似,对于任意的i至j之间的最值,和之前构造的f数组有什么关系呢?

我们可以知道,任意的i至j之间的j-i+1个连续的值,一定可以分成两个2^n个数的两个区域(可以重合)。

比如说要求3到11之间的最值。

那么可以通过3到10之间的最值和4到11之间的最值求得3到11之间的最值,那么就可以和之前的f数组联系在一起了。

有j-i+1是个数,p=2^(  (int) (log(2,j-i+1))  )就是可以连续分的最大2^n大小的块(不难理解)。

比如3到11之间的9个元素,最大可以分8大小的块。

3~10,4~11(从头开始数8个,从尾开始数8个)

那么就是计算 i~i+p-1,j-p+1~j的最值,每一个区域的个数是p个。

那么可以转化为f数组的f[i,log(2,p)],f[j-p+1,log(2,p)]两个范围。

即是计算

k=(int)(ln(j-i+1)/ln(2));

rmq(i,j)=max(f[i,k],f[i-2^k+1,k]);

理解为主,不然很容易搞错其中的+1  -1;

【转】RMQ-ST算法详解的更多相关文章

  1. 【原创】RMQ - ST算法详解

    ST算法: ID数组下标: 1   2   3   4   5   6   7   8   9    ID数组元素: 5   7   3   1   4   8   2   9   8 1.ST算法作 ...

  2. ST算法详解

    ST算法详解 Coded by Jelly_Goat. All rights reserved. 这个主要是说ST表的. 首先了解一下ST表是什么. 先来一个老套的情景带入. (假设所有的题目都是1s ...

  3. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  4. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

  5. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  6. [转] KMP算法详解

    转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的K ...

  7. 【转】AC算法详解

    原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...

  8. KMP算法详解(转自中学生OI写的。。ORZ!)

    KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句 ...

  9. EM算法详解

    EM算法详解 1 极大似然估计 假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成 ...

  10. Tarjan算法详解

    Tarjan算法详解 今天偶然发现了这个算法,看了好久,终于明白了一些表层的知识....在这里和大家分享一下... Tarjan算法是一个求解极大强联通子图的算法,相信这些东西大家都在网络上百度过了, ...

随机推荐

  1. android收起软键盘

    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);if(imm != null) ...

  2. 基于Ranking-CNN的年龄识别(CVPR_2017)

    作为学习记录,将所做PPT摘录如下:

  3. rplidar 扫描角度设置

    参考网站::   https://blog.csdn.net/sunyoop/article/details/78302090 https://blog.csdn.net/dzhongjie/arti ...

  4. HTML css样式

    clear: both清除左侧和右侧浮动 status: 变量状态参数,该属性有5个常用值count 表示当前遍历集合的元素个数index 表示当前遍历到集合的第几个元素current 表示当前的集合 ...

  5. Atitit.跨语言 java c#.net php js常用的codec encode算法api 兼容性  应该内置到语言里面

    Atitit.跨语言 java c#.net php js常用的codec encode算法api 兼容性  应该内置到语言里面 1. 常用算法1 1.1. 目录2 1.2. 定义和用法编辑2 1.3 ...

  6. .net之Ajax获取接口数据并实现循环播放

    <script type="text/javascript"> var xhr; ; var res; window.onload = function () { xh ...

  7. codeforces #364c They Are Everywhere 尺取法

    C. They Are Everywhere time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  8. llinux获取系统时间

    linux中获取当前时间.统计程序运行时间,可以使用gettimeofday()得到毫秒级的时间统计,利用rdtsc指令获取纳秒级时间统计. gettimeofday() 它是一个linux C库函数 ...

  9. CentOS6.4下编译安装Apache2.4+PHP5.6

    安装Apache2.4: 首先从  http://httpd.apache.org/download.cgi#apache24下载apache源码包httpd-2.4.4.tar.gz从  http: ...

  10. DB2 中like的通配符以及escape关键字定义转义字符的使用

    DB2 LIKE谓词查询语句中支持 百分号(%).下划线(_)的使用,不支持方括号([])(注:它会把方括号当成实际的值而非通配符),当我们需要在LIKE 查询条件中将百分号(%).下划线(_)作为实 ...