RMQ问题是求给定区间中的最值问题。当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的算法效率不够。可以用线段树将算法优化到O(logn)(在线段树中保存线段的最值)。不过,Sparse_Table算法才是最好的:它可以在O(nlogn)的预处理以后实现O(1)的查询效率。下面把Sparse Table算法分成预处理和查询两部分来说明(以求最小值为例)。

预处理:
预处理使用DP的思想,f(i, j)表示[i, i+2^j - 1]区间中的最小值,我们可以开辟一个数组专门来保存f(i, j)的值。
例如,f(0, 0)表示[0,0]之间的最小值,就是num[0], f(0, 2)表示[0, 3]之间的最小值, f(2, 4)表示[2, 17]之间的最小值
注意, 因为f(i, j)可以由f(i, j - 1)和f(i+2^(j-1), j-1)导出, 而递推的初值(所有的f(i, 0) = i)都是已知的
所以我们可以采用自底向上的算法递推地给出所有符合条件的f(i, j)的值。

查询:
假设要查询从m到n这一段的最小值, 那么我们先求出一个最大的k, 使得k满足2^k <= (n - m + 1).
于是我们就可以把[m, n]分成两个(部分重叠的)长度为2^k的区间: [m, m+2^k-1], [n-2^k+1, n];
而我们之前已经求出了f(m, k)为[m, m+2^k-1]的最小值, f(n-2^k+1, k)为[n-2^k+1, n]的最小值
我们只要返回其中更小的那个, 就是我们想要的答案, 这个算法的时间复杂度是O(1)的.
例如, rmq(0, 11) = min(f(0, 3), f(4, 3))

感想:对于一个数组里的固定长度的区间,可以只开一个n*1维数组,算f(i,j)的时候可以将f(i,j-1)覆盖,因为用到的只是上一列的情况。

转载于:https://www.cnblogs.com/ACAC/archive/2010/05/24/1743141.html

RMQ(Range Minimum/Maximum Query)问题:相关推荐

  1. 【C++】C++11 STL算法(六):最小/最大操作(Minimum/maximum operations)、比较运算(Comparison operations)

    目录 最小/最大操作(Minimum/maximum operations) 一.max 1.原型: 2.说明: 3.官方demo 二.max_element 1.原型: 2.说明: 3.官方demo ...

  2. Codeforces Round #849 (Div. 4) F. Range Update Point Query

    Codeforces Round #849 (Div. 4) F. Range Update Point Query 题目大意: 给一串数字,有两个操作: 操作1:将 l − r l-r l−r 的数 ...

  3. RMQ(Range Minimum Query)

    2019独角兽企业重金招聘Python工程师标准>>> 问题 RMQ问题是求给定区间中的最值问题.对于长度为n的数列A,回答若干查询RMQ(A, i, j).返回数组A中下标在[i, ...

  4. Leetcode | Minimum/Maximum Depth of Binary Tree

    Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the n ...

  5. Minimum/Maximum Spanning Tree/Forest

    MST问题.对于一个有权无向图,使其原有连通块保持连通性并形成树,同时边权之和最小.换一种说法,最小生成树或者最小生成森林. 两个算法一个推论. Kruskal's Algorithm 基于贪心.将边 ...

  6. RMQ问题(线段树算法,ST算法优化)

    RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值 ...

  7. RMQ ST算法简介

    RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...

  8. 关于RMQ问题的四种解法

    什么是RMQ问题:     RMQ (Range Minimum/Maximum Query):对于长度为n的数组A,回答若干询问RMQ(A,i,j)(i,j<=n-1),返回数组A中下标在i, ...

  9. 【RMQ问题】求数组区间最大值,NYOJ-1185-最大最小值

    转自:http://blog.csdn.net/lilongherolilong/article/details/6624390 先挖好坑,明天该去郑轻找虐 RMQ(Range Minimum/Max ...

最新文章

  1. ios(iphone/ipad)开发笔记(1)
  2. python爬取小说章节信息用pygame进行数据显示_爬虫不过如此(python的Re 、Requests、BeautifulSoup 详细篇)...
  3. linux设备驱动程序jd,Linux设备驱动程序学习(基于2440的GPIO字符设备驱动)
  4. 函数调用通过函数名字符串调用函数【C语言版】
  5. Python:Selenium 1:浏览器驱动
  6. (轉載) 大學就學貸款 可分12年還 (News)
  7. ubuntu18.10下面安装nodejs和npm和cnpm
  8. Oracle 一些常用函数
  9. android 动态库 后缀,Android Robolectric加载运行本地So动态库
  10. android 3.x,Android Studio3.x的坑(三)
  11. PostgreSQL的backuplabel file 初步学习
  12. tensorflow : gfile 函数
  13. Vue:vue中axios发起http请求报错net::ERR_CERT_DATE_INVALID
  14. GDPR法律条款解读及应对指南(全面版)
  15. 空间点与直线距离算法
  16. html中首行缩进两个字符
  17. Android 10 SystemUI中Android.bp文件中集成第三方JAR包或者so文件的方法
  18. 手游实时阴影方案之Projector Shadow
  19. 服务器证书类型有哪些
  20. 【MongoDB】继续在简单操作的边缘试探D2

热门文章

  1. Java基础知识强化49:10个实用的但偏执的Java编程技术
  2. CRITICAL_SECTION的详细说明
  3. 使用设置报头x-Frame-Options限制iframe网页嵌套
  4. 历届 SIGGRAPH 上有什么新奇、有趣的项目?
  5. 泊松图像融合(泊松融合)
  6. 【云计算虚拟化】docker在ubuntu14.04下的安装
  7. 基于用户投票的排名算法(一):Delicious和Hacker
  8. kafka环境安装及简单使用(单机版)
  9. 视频|每日CeBIT:IBM九大展区各显神通,传统工业与工业4.0的博弈
  10. 深度优先算法--判断迷宫的一个起点能否到达一个终点