RMQ(Range Minimum/Maximum Query),即区间最值问题。

对于长度为 n 的数列 A ,回答若干查询 RMQ(A,i,j)(i,j<=n) ,返回数列 A 中下标在 i,j 里的最大(小)值。

相关算法

  1. 朴素(搜索),时间复杂度:\(O(n)-O(q \times n)\) ,在线;
  2. 线段树,时间复杂度:$O(n)-O(q\times logn) $,在线;
  3. ST(动态规划),时间复杂度:\(O(n\times logn)-O(q)\),在线;
  4. RMQ标准算法,先规约为LCA,再规约成约束RMQ ,时间复杂度:\(O(n)-O(q)\),在线。

ST 算法

假设当前题目要求区间最小值,我们令 dp[i][j] 代表从 i 开始,长度为\(2^{j}\)这段区间的最小值。

于是便有:\(dp[i][j]=min(dp[i][j-1],dp[i+^{j-1}][j-1])\)

分析可知,\(dp[i][j-1]\)代表从 i 开始,长度为\(2^{j}\)区间一半中的最小值,而 \(dp[i+2^{j-1}][j-1]\)即为区间的另一半。

即为区间的另一半。

最终(从下往上看):

\(dp[0][*]\) \(dp[1][*]\) \(dp[2][*]\) \(dp[3][*]\) \(dp[4][*]\) \(dp[5][*]\) \(dp[6][*]\) \(dp[7][*]\)
\(dp[*\)][3] \(1\)
\(dp[*\)][2] \(1\) \(1\) \(1\) \(5\) \(2\)
\(dp[*][1]\) \(3\) \(1\) \(1\) \(5\) \(7\) \(6\) \(2\)
\(dp[*][0]\) \(4\) \(3\) \(1\) \(5\) \(7\) \(8\) \(6\) \(2\)

预处理

根据状态转移方程,首先指定当区间长度为\(2^{0}\)时的各初始值,随后推出后面的结果。

void ST_Init(const vector<int> &A) {
int n=A.size();
for (int i=0; i<n; i++)
dp[i][0]=A[i];
for (int j=1; (1<<j)<=n; j++)
for (int i=0; i+(1<<j)<=n; i++)
dp[i][j]=min(dp[i][j-1], dp[i+(1<<(j-1))][j-1]);
}

查询

预处理出整个 dp 数组以后,查询操作很简单,令 k 为满足\(2^{k} \leq R-L+1\)的最大整数,则以 L 开头、以 R 结尾的两个长度为\(2^{k}\)的区间合起来即覆盖了查询区间 [L,R]

int RMQ(int L, int R) {
int k=0;
while ((1<<(k+1))<=R-L+1) k++;
return min(dp[L][k], dp[R-(1<<k)+1][k]);
}

嗯!怎么说呢?感觉线段树在这种类型的题目中好像是最万能的方法了。

无论是 [点修改+查询] 还是 [区间修改+查询] ,它都可以做到 \(O(logn)\)的复杂度,而且在线段树中我们也可以维护好多东西(区间和、最值等等)。

对于一维中的线段树,我们想要查询某个区间的最值,首先就应该建树咯~(具体方法省略

而在查询时,我们可以从根节点向下递归搜索,如下图,假设查询区间为 [2,6]

[2,6] 这一个大区间分解为不相交的三个小区间 [2,3]、[4,5]、[6] ,而最终的结果便由这三个节点中所维护的信息决定的!

我们假设查询还是区间最小值,于是最终的结果为\(\min(1,7,6)=1\)

线段树可以解决普通的 [点/区间] 修改+查询 ,当然它也可以解决 树中的路径权值 修改+查询(树链剖分)。

『数据结构』RMQ问题的更多相关文章

  1. 『图论』LCA 最近公共祖先

    概述篇 LCA (Least Common Ancestors) ,即最近公共祖先,是指这样的一个问题:在一棵有根树中,找出某两个节点 u 和 v 最近的公共祖先. LCA 可分为在线算法与离线算法 ...

  2. 『TensotFlow』RNN中文文本_下_暨研究生开学感想

    承前 接上节代码『TensotFlow』RNN中文文本_上, import numpy as np import tensorflow as tf from collections import Co ...

  3. 『TensotFlow』RNN中文文本_上

    中文文字预处理流程 文本处理 读取+去除特殊符号 按照字段长度排序 辅助数据结构生成 生成 {字符:出现次数} 字典 生成按出现次数排序好的字符list 生成 {字符:序号} 字典 生成序号list ...

  4. 『PyTorch』第三弹重置_Variable对象

    『PyTorch』第三弹_自动求导 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Varibale包含三个属性: data ...

  5. 『Json』常用方法记录

    json模块可以把字典结构改写为string然后保存,并可以反向读取字典 pickle模块则可以持久化任意数据结构 但是即使同样是字典数据结构,两个包也是有差别的, json字典value不支持其他对 ...

  6. 『StabilityGuide』| 10+位阿里技术专家共同发起稳定性知识库开源项目

    我们穿过山和大海,也见过人山人海.我们见过各类故障,也排过千雷万险.这一次,不如我们一起,开启稳定性的探索之旅.让无法解决的问题少一点点,让世界的确定性多一点点. 无论是前端业务的开发者,还是后端架构 ...

  7. 『AngularJS』$location 服务

    项目中关于 $location的用法 简介 $location服务解析在浏览器地址栏中的URL(基于window.location)并且让URL在你的应用中可用.改变在地址栏中的URL会作用到$loc ...

  8. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  9. JS 中通过对象关联实现『继承』

    JS 中继承其实是种委托,而不是传统面向对象中的复制父类到子类,只是通过原型链将要做的事委托给父类. 下面介绍通过对象关联来实现『继承』的方法: Foo = { // 需要提供一个 init 方法来初 ...

随机推荐

  1. Web Storage和cookie的区别——每日一题20190629

    Web Storage? 使用HTML5可以在本地存储用户的浏览数据. 使用的主要目的是为了克服Cookie带来的一些限制,当数据需要被严格控制在客户端上时,无需持续的将数据发回服务器 主要目标: 1 ...

  2. macOS10.14.2 gem 更新问题

    macOS10.14.2,最近cocoapods不能正常使用了. 终端输入 sudo gem update –system 显示如下错误 ERROR: While executing gem … (G ...

  3. tcpdump使用详情及案例

    转载http://starsliao.blog.163.com/blog/static/89048201062333032563/ TCPdump抓包命令tcpdump是一个用于截取网络分组,并输出分 ...

  4. 深入理解Transformer及其源码解读

    深度学习广泛应用于各个领域.基于transformer的预训练模型(gpt/bertd等)基本已统治NLP深度学习领域,可见transformer的重要性.本文结合<Attention is a ...

  5. spring boot 2.x文件路径映射问题汇总

    当我们在运行可执行的java jar包的时候,我们肯定改变不了jar里面的内容,因此文件上传路径就成了我们必须考虑的一点问题,我们不能往直接这个jar包里面写文件,那么只能写在jar包外面,但是写到j ...

  6. LevelDB性能测试|Golang调用LevelDB

    LevelDB性能测试|Golang调用LevelDB 不同方式使用压力测试 用ssdb,TCP连接方式调用,底层存储levelDB 直接调用Cgo的levelDB (必须保证串行) 直接调用Gola ...

  7. ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  8. [AHOI2002]哈利·波特与魔法石

    这道题比较简单,就是一个最短路(SSSP).数据水,用Floyd即可AC.这里用了Dijkstra. #include <iostream> #include <cstdio> ...

  9. 【译】Source Maps浅析

    Time:2019/10/27~2019/10/29 Link: 原文链接 译文开始: 对网站进行性能优化对一个最容易的方法就是把JS和CSS进行打包压缩.但是当你需要调试这些压缩文件中的代码的时候, ...

  10. JSONP安全防御要点

    严格安全地实现CSRF方式调用JSON文件:限制Referer.部署一次性token等. 严格安装JSON格式标准输出Content-Type及编码(Content-Type: application ...