【算法学习笔记】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 ...
随机推荐
- element UI实现动态生成多级表头
一.效果图 二.封装两个组件,分别为DynamicTable.vue和TableColumn.vue,TableColumn.vue主要是使用递归来对表头进行循环生成 DynamicTable.vue ...
- 微信扫码无法直接下载APP的apk的解决办法
PHP的处理方式:http://blog.sina.com.cn/s/blog_4cd978f90102wx92.html
- OS X更新Catalina 10.15.2后虚拟机黑屏(已解决)
简述 问题:更新OS X 10.15.2后VM Ware进unbuntu 16.0黑屏,但是VM Ware 有显示,情况类似如下: 解决办法 重启系统,command+r 进入恢复模式,打开bas ...
- 【转帖】Windows与Linux系统下的库介绍
Windows与Linux系统下的库介绍 http://embeddedlinux.org.cn/emb-linux/entry-level/200903/12-553.html 库的定义 库文件是一 ...
- Oracle的基本操作-修改表结构、数据的增删改查
创建一个person表 create table person( pid ), pname ) ); 添加一列 ); 修改列类型 ); 修改列名称 alter table person rename ...
- django channels
django channels django channels 是django支持websocket的一个模块. 1. 安装 `pip3 install channels` 2. 快速上手 2.1 在 ...
- MySQ-表关系-外键-修改表结构-复制表-03
目录 前言 不合理的表结构(案例) 带来的问题 如何解决问题? 如何确定表关系? 表关系 一对多 多对多 一对一 应用场景 判断表关系最简单的语法 三种关系常见案例 如何建立表关系? 外键 forei ...
- 并不对劲的CF1237D&E:Balanced Playlist and Binary Search Trees
CF1237D Balanced Playlist 题意 有一个长度为\(n\)(\(n\leq 10^5\))的循环播放歌单,每首歌有一个优秀值\(a_i\)(\(a_i\leq 10^9\)). ...
- tensorflow零起点快速入门(2)
指定设备与矩阵乘法 使用tf.device("/gpu:0")用于指定设备进行运算. 在使用jupyter notebook的时候,可能会出现使用异常,需要使用config=tf. ...
- Spring实战(六)自动装配的歧义性
1.Spring进行自动装配时碰到的bean歧义性问题. 在进行自动装配时,只有仅有一个bean匹配所需结果时,才是可行的. 如果不仅仅一个bean能够匹配结果,例如一个接口有多个实现,这种歧义性会阻 ...