高级搜索——ST表,离线RMQ问题

文章目录

    • 前言
    • 可重复贡献问题
    • ST表的定义
    • ST表的存储结构
    • ST表的预处理
      • 预处理的实现
    • ST表的区间查询
      • 对于k的获取
      • 区间查询的实现
    • OJ链接

前言

对于查询区间最值的方法,我们常用的就是线段树,树状数组,单调队列,而树状数组更适合用于快速求区间和,而单调队列维护区间最值只在特殊情况下适用,最无解的线段树空间开销大,而且有一定的代码量,它在动态维护区间最值上基本上可以说是最优解,但是如果是离线询问的话,本文将介绍的ST表,代码量远小于线段树,而且还能达到不错的时间复杂度。

可重复贡献问题

可重复贡献问题是指,对于运算opt ,任意操作数x,都满足x opt x = x。例如,max(x , x) = x , gcd(x , x) = x,因此,RMQ(区间最值查询)和区间gcd问题也是可重复贡献问题。

ST表的定义

ST表(Sparse Table)稀疏表,是一种适用于符合结合律且可重复贡献的信息查询的数据结构,如区间最大值、最小值、最大公因数,最小公倍数,按位或,按位与等。在处理RMQ(查询区间最值)问题时,通过倍增思想,我们可以以O(nlogn)预处理,从而实现O(1)查询。

ST表的存储结构

ST表的存储结构非常简单,就是一个二维数组f , 其中,f[i][j]代表以第i个数为起点,长度为2^j次方的区间内的最值

我们接下来均以最大值做讨论。

#define N 100010
int f[N][20];

ST表的预处理

我们如何去获取这样一个ST表呢?

对于一个大问题我们可以将其拆解为若干个小问题,利用其可重复贡献性来逐步得到我们问题的答案。

ST表以倍增法递推来预处理ST表,其实是一种自下而上的动态规划。

对于一个区间最大值而言,显然等于两个等长子区间最大值的最大值。那么根据我们f[i][j]的定义,可有如下递推公式:
f [ i ] [ j ] = m a x ( f [ i ] [ j − 1 ] , f [ 1 + ( i + 2 j − 1 ] [ j − 1 ] ) f[i][j] = max(f[i][j-1] , f[1+(i+2^{j-1}][j-1]) f[i][j]=max(f[i][j1],f[1+(i+2j1][j1])
那么我们只需要固定区间长度然后枚举起点,自下而上进行动态规划即可,由于区间长度每次倍增,所以不难得出我们的时间复杂度为O(nlogn)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预处理的实现

实现流程:

  • 目标序列arr,长度为n,下标从1开始
  • 初始化f[i][0]为arr[i]
  • 枚举长度j,然后枚举起点i进行状态转移
  • 注意区间边界和位运算优先级
    for (int i = 1; i <= n; i++)f[i][0] = arr[i];for (int j = 1; j <= 20; j++)for (int i = 1; i + (1 << j) - 1 <= n; i++)f[i][j] = min(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);

ST表的区间查询

我们ST表能够实现对于任意区间[l , r](1<= l,r <=n)内的最值查询,那么是如何实现的呢?

我们已经知道了区间最值可以有子区间最值转移而来,那么对于区间[l , r]我们一定可以找到k,使得
2 k ≤ log ⁡ 2 ( r − l + 1 ) < 2 k + 1 2^{k}\le\log_{2}{(r - l + 1)}<2^{k+1} 2klog2(rl+1)<2k+1
那么我们可以得到分别以l为左端点和以r为右端点的两个长度为2^k的区间,这两个区间的最值的最值就是我们[l , r]区间内的最值。
q u e r y ( l , r ) = m a x ( f [ l ] [ k ] , f [ r − 2 k + 1 ] [ k ] ) query(l , r) = max(f[l][k],f[r-2^{k}+1][k]) query(l,r)=max(f[l][k],f[r2k+1][k])
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于k的获取

k显然就是log2 (r - l + 1)向下取整,这里我们有两种方案获取log2值

F1 递推预处理

观察下2^n求和公式很容易想明白这个递推,我们O(n)预处理,分摊每次取log2为O(1)

//int Log2[N]{0};
for (int i = 2; i <= n; ++i)Log2[i] = Log2[i / 2] + 1;

F2 直接用cmath里的log2

区间查询的实现

    for (int i = 0; i < n; i++){//l = read(), r = read();cin >> l >> r;int k = log2(r - l + 1);cout << min(f[l][k], f[r - (1 << k) + 1][k]) << " ";//write(min(f[l][k], f[r - (1 << k) + 1][k])), putchar(' ');}

到此ST表的原理及实现就结束了,代码量非常少,在处理离线查询跟线段树的代码量比起来,显然这个出错率更低。

我们上面都是以最大值为例进行实现的,在实际应用中只要是满足结合律且可重复贡献的信息查询都在ST表的解决范围内,因为ST表能够对两个交集非空的子区间进行信息合并,这也就是重复贡献的精妙之处。

OJ链接

A几个水题爽一下

找几个板子题练练手

P3865 【模板】ST 表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1816 忠诚 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

[P2880 USACO07JAN] Balanced Lineup G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【互斥锁不当使用导致的条件竞争】2021_DiceCTF_hashbrown

前言 这个题目还挺有意思的&#xff0c;他并不像之前做的题目直接给你一个贴脸的 UAF 等&#xff0c;而是把 UAF 放在了条件竞争的环境下&#xff0c;其实条件竞争这个漏洞在内核中经常出现。 这里题目没有去符号&#xff0c;所以逆向的难度不是很大&#xff0c;但作者似乎在…

Android蓝牙协议栈fluoride(二) - 软件框架

概述 fluoride 协议栈在整个软件框架中作为一个中间件的角色&#xff0c;向上对接APP&#xff0c;向下对接蓝牙芯片。fluoride采用C语言实现&#xff0c;与APP(Jave)通信采用JNI机制&#xff1b;与蓝牙芯片通信使用HCI硬件接口&#xff08;HCI软件协议参考蓝牙核心规范&#x…

毕设:《基于hive的音乐数据分析系统的设计与实现》

文章目录 环境启动一、爬取数据1.1、歌单信息1.2、每首歌前20条评论1.3、排行榜 二、搭建环境1.1、搭建JAVA1.2、配置hadoop1.3、配置Hadoop环境&#xff1a;YARN1.4、MYSQL1.5、HIVE(数据仓库)1.6、Sqoop&#xff08;关系数据库数据迁移&#xff09; 三、hadoop配置内存四、导…

FFA 2023 明日开幕,Flink 智能诊断、小红书流批一体实践精彩来袭

近年来&#xff0c;流批一体的技术思想势头火热&#xff0c;即“将批处理和流处理相结合&#xff0c;实现更好的数据处理能力”&#xff0c;已成功从理论层面走进现实世界。Flink 是一款高吞吐量、低延迟的流处理引擎&#xff0c;具备统一接口、高性能、低延迟、容错性和可扩展…

绑定域名简单教程

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f324;️安装Nginx环境 &…

2024黑龙江省职业院校技能大赛信息安全管理与评估赛项规程

2024黑龙江省职业院校技能大赛暨国赛选拔赛 “GZ032信息安全管理与评估”赛项规程 极安云科专注技能竞赛&#xff0c;包含网络建设与运维和信息安全管理与评估两大赛项&#xff0c;及各大CTF&#xff0c;基于两大赛项提供全面的系统性培训&#xff0c;拥有完整的培训体系。团队…

【Qt开发流程】之元对象系统

描述 Qt的元对象系统&#xff08;Meta-Object System&#xff09;是Qt框架的核心机制之一&#xff0c;它提供了运行时类型信息&#xff08;RTTI&#xff09;和信号与槽&#xff08;Signals and Slots&#xff09;机制的支持。元对象系统在Qt中扮演了很重要的角色&#xff0c;它…

适合炎热天气的最佳葡萄酒有哪些?

每年的夏天&#xff0c;白葡萄酒和玫瑰红葡萄酒总会是葡萄酒爱好者的首选&#xff0c;这是为什么呢&#xff1f;随着春天的逝去&#xff0c;夏天悄悄地到来&#xff0c;空气变得炎热和沉重&#xff0c;树木变得越来越郁郁葱葱&#xff0c;白天的时间更长而晴朗了。多雨的五月变…

12.7作业

1. #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//***********窗口相关设置***********//设置窗体大小this->resize(540,410);this->setFixedSize(540,410);//取消菜单栏this->setWindowFlag(Qt::FramelessWindowHint);/…

SuperMap iObject.NET三维场景拖拽框选实现详解及完整源代码(一)——环境准备及项目配置

作者&#xff1a;超图研究院技术支持中心-于丁1 SuperMap iObject.NET三维场景拖拽框选实现详解及完整源代码&#xff08;一&#xff09;——环境准备及项目配置   三维场景框选是一种在三维空间中进行选择和操作的功能&#xff0c;它可以让使用者通过鼠标拖动来创建一个矩形…

Verilog学习 | 用initial语句写出固定的波形

initial beginia 0;ib 1;clk 0;#10ia 1; #20ib 0;#20ia 0; endalways #5 clk ~clk; 或者 initial clk 0;initial beginia 0;#10ia 1; #40ia 0; endinitial beginib 1;#30 ib 0; endalways #5 clk ~clk;

新书推荐——《Copilot和ChatGPT编程体验:挑战24个正则表达式难题》

《Copilot和ChatGPT编程体验&#xff1a;挑战24个正则表达式难题》呈现了两方竞争的格局。一方是专业程序员David Q. Mertz&#xff0c;是网络上最受欢迎的正则表达式教程的作者。另一方则是强大的AI编程工具OpenAI ChatGPT和GitHub Copilot。 比赛规则如下&#xff1a;David编…

基于jsp+servlet的在线考试系统

基于jspservlet的在线考试系统, 演示地址:英语在线考试系统考生测试账号:用户名:stu,密码:stu,管理员测试账号用户名:admin,密码:admin &#xff08;源码里包含数据库文件&#xff09; 本系统分为两个角色&#xff0c;一个时考生&#xff0c;一个是管理员&#xff0c;考生可…

架构师一1.功能权限

1. RBAC 权限模型 系统采用 RBAC 权限模型&#xff0c;全称是 Role-Based Access Control 基于角色的访问控制。 简单来说&#xff0c;每个用户拥有多个角色&#xff0c;每个角色拥有多个菜单&#xff0c;菜单中存在菜单权限、按钮权限。这样&#xff0c;就形成了 “用户<-…

第二十一章网络通信总结博客

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissio…

Linux 环境变量 与 命令行参数

什么是环境变量 从结构上来看&#xff0c;环境变量就是操作系统维护的一组&#xff1a;key-value 的键值对。 不知道你是否有一个疑问&#xff1a;为什么我们写代码编译链接 形成的可执行程序要运行起来需要带路径呢&#xff1f;Linux 内置的命令也是可执行程序&#xff0c;为…

html刷题笔记

1 em 12 pt 16 px 100% source元素为audio、video、picture元素指定多个媒体文件 margin是用来隔开元素与元素的间距&#xff1b;padding是用来隔开元素与内容的间隔。 margin用于布局分开元素使元素与元素互不相干&#xff1b;padding用于元素与内容之间的间隔&#xff0c;…

【前端架构】清洁前端架构

探索前端架构&#xff1a;概述与干净的前端架构相关的一些原则&#xff08;SOLID、KISS、DRY、DDD等&#xff09;。 在我之前的一篇帖子中&#xff0c;我谈到了Signals和仍然缺少的内容[1]。现在&#xff0c;我想谈谈一个更通用的主题&#xff0c;即Clean Frontend Architectu…

Mysql综合案例练习<1>

MySql综合案例练习<1> 题目一题目二题目三题目四题目五题目六题目七题目八题目九题目十题目十一题目十二题目十三题目十四题目十五题目十六题目十七题目十八题目十九 题目一 创建数据库test01_library 创建表 books&#xff0c;表结构如下&#xff1a; CREATE DATABASE …