RMQ英文是Range Maximum(Minimum) Query,是用来求某个区间的最大值/最小值,通常用在查询次数比较大的区间最值问题中。
RMQ的原理是动态规划,利用了倍增的思想。我们用A[1...N]表示一组数,[Li,Ri]表示题目涉及到的查询区间。
设F[i,j]表示从A[i]到A[i + (2^j) - 1]这个范围的最大值,也就是以A[i]为起点的连续2^j个数的最大值。由于元素个数是2^j,可以均分为两部分,每部分有2^(j-1)个数。整个区间的最大值肯定是前半部分的最大值和后半部分最大值的较大者,满足动态规划的最优子结构。
则动归方程为:F[i, j] = max(F[i, j-1], F[i+2^(j-1), j-1],边界条件:F[i,0] = A[i]。
这样,就可以用nlog2n的复杂度预处理数组。对于查询区间[Li,Ri],先求出满足2^x<=Ri-Li+1的最大的x值。那么[Li,Ri]的最大值为区间[Li, Li+(2^x)-1]和区间[Ri-(2^x)+1,Ri]的较大者,即max(F[Li,x], F[Ri-(2^x)+1,x])。
这样每次查询的时间复杂度与查询区间的长度无关,都是O(1)。
public class RMQ {
private int[] array;
private int[][] f;
private int[][] s;
public void rmq() {
int len = array.length;
int count = 1;
while( (1 << count) <= len)
count++;
f = new int[len][count];
s = new int[len][count];
for (int i = 0; i < len; i++) {
f[i][0] = array[i];
s[i][0] = array[i];
}
for (int j = 1; (1 << j) <= len; j++) {
for (int i = 0; i + (1 << j) - 1 < len; i++) {
f[i][j] = Math.max(f[i][j-1], f[i+(1<<j-1)][j-1]);
s[i][j] = Math.min(s[i][j-1], s[i+(1<<j-1][j-1]);
}
}
}
public int query(int begin, int end) {
int len = end - begin + 1;
int count = 1;
while((1 << count) <= len)
count++;
count--;
return Math.max(f[begin][count], f[end-(1<<count)+1][count-1]);
}
public static void main(String[] args) {
RMQ r = new RMQ();
r.array = new int[] {12,11,99,78,9,0,4,90,2,1};
r.rmq();
System.out.println(r.query(0, 9));
}
}
分享到:
相关推荐
标题中的"rmq.rar_RMQ_RMQ algorithm_RMQ c++"表明我们将讨论RMQ算法以及其在C++编程语言中的实现。 **RMQ问题定义** RMQ问题的定义是这样的:给定一个长度为n的数列A,我们需要处理多个查询,每个查询询问数列A中...
RMQ(Range Minimum/Maximum Query,区间最值查询)和LCA(Least Common Ancestor,最近公共祖先)是数据结构和算法中的重要概念,它们在解决实际问题中有着广泛的应用。下面将详细介绍这两种算法的基本概念、经典...
### RMQ(Range Minimum/Maximum Query)详解 #### 引言 在计算机科学与算法设计领域,RMQ问题,即范围最小/最大查询问题,是一个经典的动态规划与数据结构问题。它涉及到对一段连续的数据进行快速查询,找到该区间...
### RMQ算法(倍增法) #### 一、引言 RMQ问题(Range Minimum/Maximum Query,区间最小/大值查询)是计算机科学中一个非常基础且重要的问题。其核心在于快速找到数组中某个指定区间内的最大或最小值。在实际应用...
在ACM(国际大学生程序设计竞赛)中,RMQ(Range Minimal Query)和LCA(Least Common Ancestor)是两种常见的数据结构问题,通常出现在树形结构或数组中。 RMQ问题指的是在一个数组中,对给定区间进行最小值查询。...
### RMQ在信息学竞赛中的应用 #### 一、RMQ简介 RMQ(Range Maximum/Minimum Query)是指在一个固定数组中查询特定区间内的最大值或最小值的问题。这类问题在算法竞赛中非常常见,特别是在那些需要频繁进行区间...
上海人民RMQ6系列自动转换开关是一款针对不间断供电需求设计的开关设备,广泛应用于工业、医疗、银行、商业和高层建筑等重要场所。产品具备自动检测、自动切换电源的功能,可在常用电源出现故障时,迅速切换到备用...
**RMQ(Range Minimum Query)与LCA(Lowest Common Ancestor)问题**是图论与数据结构领域中的两个重要概念,广泛应用于算法设计和优化。这篇由郭华阳所著的国家队论文深入探讨了这两个问题及其解决方案。 **RMQ...
在信息学奥赛中,RMQ(Range Minimum Query,范围最小值查询)是一个常见的数据结构问题,它涉及高效地处理数组或序列中的区间最值查询。 RMQ问题通常出现在算法竞赛和训练中,以考察选手的数据结构设计和优化能力。...
伊顿主令控制产品按钮和指示灯RMQ16 - 选择指南pdf,现代机器设备的控制面板,即使可用空间有限,也需要传达日益复杂的信息。RMQ16系列紧凑型主令电器为您提供理想的解决方案。按钮头防护等级高达IP65,确保了在恶劣...
本文将深入解析线段树的基本概念、构建原理、关键操作以及在RMQ(Range Minimum Query)问题中的应用。 ### 基本概念 线段树由一系列节点组成,每个节点表示一个区间,并存储与该区间相关的统计信息。节点可以是...
关于RMQ和LCA的关系的知识,如何用RMQ和LCA的转换
本文提到的RMQ1系列自动转换开关能够应对欠电压、过电压或断相的情况,确保在任何一路电源失效时能够自动切换到另一路正常供电,具备过电流保护功能。此类设备一般应用于医院、数据中心、通信基站等关键负载场合。 ...
根据提供的文档内容,我们可以深入探讨RMQ问题及其解决方法之一:ST算法。 ### RMQ问题概述 RMQ问题,全称为Range Minimum Query / Range Maximum Query(区间最小值查询/区间最大值查询),指的是在一个给定的...
### RMQ与LCA:最近公共祖先解析及解法 #### 一、引言 在计算机科学领域,尤其是在算法设计中,“最近公共祖先”(LCA, Least Common Ancestor)和“区间最小值查询”(RMQ, Range Minimum Query)是两个非常重要...
标题中的“JMeter用来测试RMQ的消息发布订阅接收器插件AMQP取样器”指出,这个插件是为Apache JMeter设计的,用于测试RabbitMQ(简称RMQ)的AMQP(Advanced Message Queuing Protocol)协议功能。AMQP是一种开放标准...
这是一个关于后缀数组的与RMQ、LCP有关的资料。。。
上海人民RMQ5系列自动转换开关是一款用于电力系统中的重要设备,主要用于检测供电线路中的过电压、欠电压和断相等情况,并在满足预定条件下自动切换两组电源。此类设备主要用于需要持续不间断供电的场合,如医院、...
该ppt讲了一种基于线段树的RMQ的ST算法问题和LCA算法,适合初学者用。