首页 > 其他分享 >RMQ(Range Minimum Query)问题

RMQ(Range Minimum Query)问题

时间:2023-02-03 11:06:55浏览次数:36  
标签:RMQ log max 最大值 算法 查询 Range Query


问题描述

RMQ问题是求给定区间中的最值问题。对于长度为n的数列A,回答若干查询RMQ(A, i, j)。返回数组A中下标在[i,j]里的最小值的下标。比如数列 5,8,1,3,6,4,9,5,7      那么RMQ(2,4) = 3, RMQ(6,9) = 6.

 

解决问题

最简单的解法时间复杂度是O(n),就是对于每一个查询遍历一遍数组。但是当n非常大的时候,并且查询次数非常多的时候,这个解决方案就不是那么高效了。

使用线段树(以后会讲)可以将时间复杂度优化到O(logn),通过在线段树中保存线段的最值。

不过本文将介绍一个解决RMQ最强大的算法,Sparse-Table算法。

Sparse-Table算法是一个在线算法,所谓在线算法,是指用户每输入一个查询便马上处理一个查询。该算法一般用较长的时间做预处理,待信息充足以后便可以用较少的时间回答每个查询。ST(Sparse Table)算法是一个非常有名的在线处理RMQ问题的算法,它可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。

首先是预处理,用动态规划(DP)解决。设A[i]是要求区间最值的数列,F[i, j]表示从第i个数起连续2^j个数中的最大值。例如数列3 2 4 5 6 8 1 2 9 7,F[1,0]表示第1个数起,长度为2^0=1的最大值,其实就是3这个数。 F[1,2]=5,F[1,3]=8,F[2,0]=2,F[2,1]=4……从这里可以看出F[i,0]其实就等于A[i]。这样,DP的状态、初值都已经有了,剩下的就是状态转移方程。我们把F[i,j]平均分成两段(因为f[i,j]一定是偶数个数字),从i到i+2^(j-1)-1为一段,i+2^(j-1)到i+2^j-1为一段(长度都为2^(j-1))。用上例说明,当i=1,j=3时就是3,2,4,5 和 6,8,1,2这两段。F[i,j]就是这两段的最大值中的最大值。于是我们得到了动态规划方程F[i, j]=max(F[i,j-1], F[i + 2^(j-1),j-1])。

然后是查询。取k=[log2(j-i+1)],则有:RMQ(A, i, j)=min{F[i,k],F[j-2^k+1,k]}。 举例说明,要求区间[2,8]的最大值,总共2到8是7个元素,所以k=2,那么就要把它分成[2,5]和[5,8]两个区间,因为这两个区间的最大值我们可以直接由f[2,2]和f[5,2]得到。

具体如下图所示:

RMQ(Range Minimum Query)问题_数组

代码:

INIT_RMQ

//max[i][j]中存的是重i开始的2^j个数据中的最大值,最小值类似,num中存有数组的值

for i : 1 to n

max[i][0] = num[i]

for j : 1 to log(n)/log(2)

for i : 1 to (n+1-2^i)

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

//查询

RMQ(i, j)

k = log(j-i+1) / log(2)

return MAX(max[i][k], max[j-2^k+1][k])

 

标签:RMQ,log,max,最大值,算法,查询,Range,Query
From: https://blog.51cto.com/u_15952369/6035567

相关文章

  • SPOJ375--Query on a tree(树链剖分)
    Description:Youaregivenatree(anacyclicundirectedconnectedgraph)with N nodes,andedgesnumbered1,2,3...N-1.Wewillaskyoutoperfromsomeins......
  • jQuery-动画 jQuery-遍历
    jQuery-动画 三种方式显示和隐藏元素1.默认显示和隐藏方式1.show([speed,[easing],[fn]])1.参数:1.speed:动画的速度。......
  • JQuery案例和插件机制
    案例-广告显示和隐藏需求:1.当页面加载完,3秒后,自动显示广告2.广告显示5秒后,自动消失分析:1.使用定时器完成,setTimeout(执行一次定时器)2.分析......
  • jQuery-案例-隔行换色 全选全不选 qq表情选择 下拉列表选中条目录左右移动
    jQuery-案例-隔行换色 <!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>隔行换色</title><scriptsrc="../../js/jquery-......
  • jQuery的事件处理
    jQuery的事件处理文档加载事件.ready(fn)$(document).ready(function(){//编写代码});与window.onload方法的区别执行时间:window.onload方法是在页面中所有的DOM元素(包括......
  • jQuery_6_动画效果
     使得页面具有良好的交互性。 零、动画设置1、时间slow、normal、fast、毫秒数。2、暂停暂停指定元素正在执行的动画。//暂停id为div_1的标签正在运行......
  • 图文结合带你搞懂MySQL日志之General Query Log(通用查询日志)
    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:KAiTO文章来源:GreatSQL社区原创往期......
  • 一篇文章带你了解KendoReact DateRangePicker,让日期选择变得更酷炫!
    KendoUI致力于新的开发,来满足不断变化的需求。现在我们非常自豪地宣布,通过React框架的KendoUIJavaScript封装来支持ReactJavascript框架。KendoReact能够为客户提供更......
  • JQuery事件绑定
    事件绑定1.jquery标准的绑定方式js对象.事件方法(回调函数);<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title></title><scriptsrc......
  • rangepicker 中文
    app.vue-----------------------------<template><a-config-provider:locale="locale"><divid="app"><router-view/></div></a-config-provider></t......