(C++) 稀疏表Sparse Table

目录

一、介绍

       1.1 倍增 

        1.2 稀疏表ST

二、原理

三、代码实现

3.1 创建稀疏表

3.2 初始化数值

3.3 ST查询


一、介绍

       1.1 倍增 

        倍增的思想是在数据空间特别大的时候,快速进行查找搜索而使用的。例如想要在一个数据量为n的递增数组中查找到等于x的下标,最简单想到的就是遍历整个数组。而现在以2^{i}步长进行搜索,若x小于该节点,则加大增量2^{i+1}继续比较;否则减小增量2^{i-1}继续比较,知道搜索到目标节点。

        1.2 稀疏表ST

        稀疏表采用了倍增的思想,在O(nlogn)时间构造了一个二维表之后,在O(1)时间在线查询[l ,r]区间的最值,有效解决区间最值问题。这是一种不支持在线修改,对静态数据进行搜索的算法。

        简单来说,稀疏表就是,对于一个区间,想要快速找到其中的最大值(最小值),于是就划分为多个区间,按照一定的步长找到对应每一个小模块的最大值后映射到一个二维表中,这样下一次查找最值的时候,就能按照规定的规律直接进行检索。

二、原理

        定义F[i,j] 表示区间[i, i + 2^{j}- 1]的最值,其中 i 为该区间的起始点,j为搜索步长,区间长度为2^{j} 。

        递推公式:F[i,j] = max(F[i,j-1],F[i+2^{j-1},j-1])

将区间划分为两个子区间后求解迭代最值。如果是创建最小值,则对公式稍微进行修改:

F[i,j] = min(F[i,j-1],F[i+2^{j-1},j-1])

        第一个区间为[i,i+2^{j-1}-1],所以第二个区间是从i+2^{j-1}开始的,这里稍微做一下解释

三、代码实现

3.1 创建稀疏表

std::vector<std::vector<int>> sparseTable;

3.2 初始化数值

函数输入需要放入稀疏表中的数组

稀疏表的第一列是数组排入,从第二列开始映射数据。

例如:[7,2,3,0,5,8,4,6]为输入数据,则

数据量n = 8;最大检索量logn = 4

创建的稀疏表为

void createSparseTable(const std::vector<int>& nums)
{int n = nums.size();		//数据量int logn = log2(n) + 1;		//稀疏表的列数,算是最大检索量sparseTable.resize(n, std::vector<int>(logn));/**稀疏表是将所有的元素都按列进行排放,横向填充*///填充第一列		for (int i = 0; i < n; i++){sparseTable[i][0] = nums[i];}//递推公式: F[i,j]=max(F[i,j-1],F[i+2^(j-1)][j-1])//填充其余列for (int j = 1; j < logn; j++){for (int i = 0; i + (1 << j) <= n; i++){sparseTable[i][j] = std::max(sparseTable[i][j - 1], sparseTable[i + (1 << (j - 1))][j - 1]);}}
}

3.3 ST查询

l,r分别为区间的左端点和右端点

//查询区间最值
int query(int l, int r)
{int len = r - l + 1;int k = log2(len);		//查询步长return std::max(sparseTable[l][k], sparseTable[r - (1 << k) + 1][k]);		//时间复杂度为O(1)的查询
}

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

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

相关文章

【6个好玩的linux终端程序】----做一个有趣的IT男

【6个好玩的linux终端程序】----做一个有趣的IT男 一、ASCIIquarium--水族馆二、cmatrix--矩阵代码三、cowsay --会说话的小牛四、sl --火车动画五、fortune--随机名言警句六、bastet-俄罗斯方块 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f4…

Jackson 2.x 系列【25】Spring Boot 集成之起步依赖、自动配置

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. 起步依赖3. 自动配置3.1 JacksonPrope…

数学建模-最优包衣厚度终点判别法-二(K-Means聚类)

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是viperrrrrrr~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff…

C语言---单链表(二)

文章目录 前言1.准备工作2,打印链表、创建新的节点、销毁链表2.1.打印链表2.2.创建节点2.3.销毁链表 3.尾插、头插、尾删、头删3.1.尾插3.2.头插3.3.尾删3.4.头删 4.在特殊位置之前、之后插入、删除以及查找节点4.1.查找节点4.2.在指定位置之前插入4.3.在指定位置之后插入数组4…

Java入门学习Day05

本篇文章主要有创建package、关系运算符、逻辑运算符、三元运算符和其对应的实例。 一、创建package 创建一个包&#xff0c;把我们之前或之后用到的运算符代码都放到这个package里&#xff0c;方面管理。 包的命名通常是公司的网站名称倒着写(com.mayin)&#xff0c;再加上…

【错题集-编程题】dd爱框框(同向双指针 / 滑动窗口)

题目链接&#xff1a;dd爱框框 (nowcoder.com) 一、分析题目 同向双指针&#xff08;其实也就是滑动窗口&#xff09;。 进窗口&#xff08;sum arr[right]&#xff09;判断&#xff08;sum > x&#xff09;更新结果&#xff08;right-left1 < retlen retl left re…

Day99:云上攻防-云原生篇K8s安全实战场景攻击Pod污点Taint横向移动容器逃逸

目录 云原生-K8s安全-横向移动-污点Taint 云原生-K8s安全-Kubernetes实战场景 知识点&#xff1a; 1、云原生-K8s安全-横向移动-污点Taint 2、云原生-K8s安全-Kubernetes实战场景 云原生-K8s安全-横向移动-污点Taint 如何判断实战中能否利用污点Taint&#xff1f; 设置污点…

【御控物联】Java JSON结构转换(3):对象To对象——多层属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、案例之《JSON对象 To JSON对象》三、代码实现四、在线转换工具五、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0c;生成新的JS…

1 GBDT:梯度提升决策树

1 前言 前面简单梳理的基本的决策树算法&#xff0c;那么如何更好的使用这个基础算法模型去优化我们的结果是本节要探索的主要内容。 梯度提升决策树&#xff08;Gradient Boosting Decision Trees&#xff09;是一种集成学习方法&#xff0c;通常用于解决回归和分类问题。它通…

【Redis 神秘大陆】009 案例实践进阶

九、案例实践&进阶方案 9.1 本地缓存组件选型 使用缓存组件时需要重点关注集群方式、集群、缓存命中率。 需要关注集群组建方式、缓存统计&#xff1b;还需要考虑缓存开发语言对缓存的影响&#xff0c;如对于JAVA开发的缓存需要考虑GC的影响&#xff1b;最后还要特别关注…

05节-51单片机-模块化编程

1.两种编程方式的对比 传统方式编程&#xff1a; 所有的函数均放在main.c里&#xff0c;若使用的模块比较多&#xff0c;则一个文件内会有很多的代码&#xff0c;不利于代码的组织和管理&#xff0c;而且很影响编程者的思路 模块化编程&#xff1a; 把各个模块的代码放在不同的…

无源光网络(PON)技术的革命:PON模块的全面解析

PON&#xff08;Passive Optical Network&#xff0c;无源光网络&#xff09;模块是一种高性能的光模块&#xff0c;用于PON系统中&#xff0c;符合ITU-T G.984.2标准和多源协议&#xff08;MSA&#xff09;。它通过不同的波长在OLT&#xff08;光线路终端&#xff09;和ONT&am…