【算法学习笔记】RMQ问题与ST表
\(0.\) RMQ问题
人话翻译
给定一个长度为\(n\)的数列\(a\),然后有\(m\)组询问,每次询问一个区间\([l,r]\)的最小值。
其中\(m,n\leq10^5\)
\(1.\) 暴力做法
很显然,暴力做法就是便历 \(\max\limits_{l\leq i\leq r}a_i\) 。这个做法最坏时间复杂度将会高达\(O(n^2)\)。很显然,这对于\(1e5\)的数据范围要炸
\(2.\) 正解
线段树
如果不知道什么是线段树,请点击这里 线段树
对于这种区间信息,线段树显然是能够维护的。但鉴于本题没有区间修改,线段树显然有点大材小用,并且数组模拟的线段树空间将会达到\(O(4n)\)
线段树还有一些缺点,就是它的查询时间复杂度最坏是\(O(logn)\)的,因为没有区间修改,这个时间开销也略微有点大。
\(ST\)表(倍增)
倍增算法的含义就是成倍增长。我们考虑一个这样的数据结构:
一个二维数组\(st\),其中
\]
我们假设一个数据:\(9\ 3\ 1\ 7\ 5\ 6\ 0\ 8\)
可以建立如下所示的\(ST\)表:

建表
我们发现,我们可以一层层地建表。这样,我们就可以通过递推,利用上层的信息,建表。
我们先将读入数据存在\(0\)这一行。
我们发现,要想实现建立这个表,我们需要每次倍增长度。而最简单的倍增长度方法就是将两段不相交的区间合并起来。
所以我们可以得到如下公式:
\]
这样,我们就能完成建表
for(rg int i=1;i<=16;i++){ // 由计算器可得 log1e5 约为 17,但是这里循环16次已经够了。
for(rg int j=1;j+(1<<i)-1<=n;j++){
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
}
}
- 注:为了方便,我们常常把这个表“竖”过来。本篇中的代码一律如此
我们可以发现,建表的时间复杂度是\(O(nlogn)\)的
查询
我们由上表知道,想要查询\([l,r]\)的最值,只需求出
\]
其中
\]
比如上方的数据,我们想要查询\([3,8]\)
我们只需要从\(3\)往后\(4\)个,\(8\) 往前\(4\)个,肯定能够完全覆盖这个区间
所以我们的查询开销是\(O(1)\)的
ans=min(st[(int)log2(len)][l],st[(int)log2(len)][r-(1<<((int)log2(len)))+1]);
至此,我们已经完成了全部内容
【算法学习笔记】RMQ问题与ST表的更多相关文章
- 某科学的PID算法学习笔记
最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- Johnson算法学习笔记
\(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...
- Johnson 全源最短路径算法学习笔记
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...
- 【模板】RMQ问题的ST表实现
$RMQ$问题:给定一个长度为$N$的区间,$M$个询问,每次询问$[L_i,R_i]$这段区间元素的最大值/最小值. $RMQ$的高级写法一般有两种,即为线段树和$ST$表. 本文主要讲解一下$ST ...
- RMQ问题及ST表
RMQ(Range Minimum/Maximum Query)问题指的是一类对于给定序列,要求支持查询某区间内的最大.最小值的问题.很显然,如果暴力预处理的话复杂度为 \(O(n^2)\),而此类问 ...
- 算法学习笔记:最近公共祖先(LCA问题)
当我们处理树上点与点关系的问题时(例如,最简单的,树上两点的距离),常常需要获知树上两点的最近公共祖先(Lowest Common Ancestor,LCA).如下图所示: 2号点是7号点和9号点的最 ...
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...
随机推荐
- MySQL知识篇-SQL1
1 SQL是什么? 答:是结构话语言,是一种操作关系型数据库的语言. 2 SQL语言分类? SQL语言 说明 举例 DDL 数据定义语言 create drop DML 数据操作语言 insert ...
- python 输出对齐
几种不同类型的输出对齐总结: 先看效果: 采用.format打印输出时,可以定义输出字符串的输出宽度,在 ':' 后传入一个整数, 可以保证该域至少有这么多的宽度. 用于美化表格时很有用. >& ...
- [转帖]图解SSL/TLS协议
图解SSL/TLS协议 作者: 阮一峰 日期: 2014年9月20日 感谢 腾讯课堂NEXT学院 赞助本站,腾讯官方的前端课程 免费试学. http://www.ruanyifeng.com/bl ...
- The import javax.websocket cannot be resolved的解决问题
在eclipse中导入项目的时候出现了这个问题,废了我半天劲,才搞明白,把问题记录下来,方便大家以后遇到这问题好处理.提供参考. 出现的问题截图: 因为我用的是tomcat8, 大体步骤:项目上点右键 ...
- springboot整合httpClient
创建httpClientConfig配置类 @Configuration @PropertySource(value="classpath:/properties/httpClient.pr ...
- 【hash+二分】Antisymmetry
[题目链接] https://loj.ac/problem/2452 [参考博客] https://blog.csdn.net/xgc_woker/article/details/82904631 [ ...
- 执行jar包,输出信息到文件
有时如果临时需要上项目执行一些脚本或者临时文件,可以将项目达成jar包,去执行 执行jar包: java -jar test.jar 输出日志到文件:nohup java -jar test.jar ...
- 百度后端C++电话一面
Json.XML差异?说全点,能想到的所有差异.然后protobuf不小心被我提出来了,开始扯三个的差异....然后问优缺点.服务端客户端使用及接口更新的影响范围如何缩小 左值,右值区别 map用什么 ...
- asp.net 13 缓存,Session存储
1.缓存 将数据从数据库/文件取出来放在服务器的内存中,这样后面的用来获取数据,不用查询数据库,直接从内存(缓冲)中获取数据,提高了访问的速度,节省了时间,也减轻了数据库的压力. 缓冲空间换时间的技术 ...
- es6字符串扩展(+模板字符串拼接)
includes() 判断字符串中是否包含指定的字串(有的话返回true,否则返回false) console.log('hello world'.includes('world' , 7)); // ...