首页 > 其他分享 >数据结构-ST表

数据结构-ST表

时间:2023-11-01 19:11:06浏览次数:29  
标签:right int Max ST 数组 数据结构 left

ST表的使用范围:

1.处理静态数组的极值问题

2.尾部增减数组的极值问题


ST表的原理:

1.预处理:ST表的中心思想是动态规划,我们规定数组 Max[i][j] 储存的是数组中从第 i 个元素开始,总共 2^j 个数字的极(大)值,区间末尾位置为 i+2^j-1。输入数组时,直接输入到 Max[i][0] 上。输入完成后,花费 O(nlogn) 来对 Max 数组中的所有值进行处理。有如下状态转移方程:
Max[i][j] = max( Max[i][j-1] , Max[i+(1<<(j-1))][j-1] );
2.查询:对于输入的边界 left 和 right, 我们令 d = floor(log2(right - left)) ,即使 2^d 成为能够被 [left, right] 覆盖的最大的 d 值。在求得d值之后,我们查询两个区间的最值:[left, left + 2^d] 和 [right - 2^d +1, right];由 d 的条件可得,这两个区间都在[left, right]上,且两个区间之和就是之前的大区间。

image

ST表基本操作:

#define rep(i,n) for(int i = 1; i <= n; i++) //简写for循环
class  STtable{
private:
	int Max[Size][31];
	int length;
public:
	void read(int n);//输入数组
	void init();//初始化处理
	int find(int l, int r);//查询结果
};
输入数组
void read(int n)
{
	length = n;
	rep(i, n)
		cin>>Max[i][0];
}
初始化处理
void init()
{
	rep(j, 31)
		rep(i, n - (1 << (j - 1)))
			Max[i][j] = max(Max[i][j-1], Max[i+(1<<(j-1))][j-1]);
}
查询结果
#include <cmath>
int find(int l, int r)
{
	if(l == r)
		return Max[l][0];//特殊处理,防止log0的出现
	int d = log2(r - l);
	return max(Max[l][d], Max[r - (1<<d) + 1][d]); 
}

尾部可增减ST表

1.增加:ST表在完成预处理后是不能直接更改原数组的数值的,不具备可维护性,但是,如果我们只对数组的尾部进行操作,可以发现新增队尾元素后,原先ST表已经维护的部分不会改变,而且需要改变的部分只需要花费 O(logn) 时间即可。
2.减少:ST表是不能随便增减元素的,但如果只是减少最后个元素,只需要让动态数组长度减少1即可。只需要在查询的过程中添加一个是否越界的条件。
对单独一个元素进行增减操作是不会出现问题的,若是先减后增,则将之前减去的部分覆盖掉即可,通过12两个操作,能确保动态数组长度范围内的查询值都是正确的即可。

image

代码:

#define rep(i,n) for(int i = 1; i <= n; i++) //简写for循环
class  STtable{
private:
	int Max[Size][31];
	int length;
public:
	void add(int n);//末尾增加元素
	void del();//末尾删除元素
	int find(int l, int r);//查询结果
};
末尾增加元素

void add(int n)
{
	length++;
	Max[length][0] = n;
	for(int i = 1; n - (1 << i) + 1 >= 1; i++)
		Max[length - (1 << i) + 1][i] = max(Max[length - (1 << i) + 1][i-1], Max[length - (1 << (i-1)) + 1][i-1]);
}

末尾删除元素
void del()
{
	length--;//真就这么简单()
}

标签:right,int,Max,ST,数组,数据结构,left
From: https://www.cnblogs.com/slotifnotias/p/17803787.html

相关文章

  • IDEA上也能用Postman了?
    Postman是大家最常用的API调试工具,国产API调试工具Apipost推出IDEA插件,写完代码就可以调试接口并一键生成接口文档!而且还可以根据已有的方法帮助您快速生成url和params。ApipostHelper=API调试工具+API管理工具+API搜索工具。在商店中搜索或直接点击下方链接即可下......
  • Vue动态添加style样式
    最近在用uniapp开发安卓app,由于语法跟vue一致,就梳理了下动态添加style的方法:Object :style="{fontSize:fontSize+'px'}":style="{fontSize:(fontSize?fontSize:'12')+'px'}" Array :style="[baseStyles,otherStyle......
  • Elasticsearch安装
    Docker单节点修改max_map_count值sysctl-wvm.max_map_count=262144创建持久化目录并配置权限mkdir/opt/elasticsearchsetfacl-mu:1000:rwx-R/opt/elasticsearch/创建配置文件mkdirconfig$cat>elasticsearch.yml<<EOFcluster.name:"docker-cluster"netw......
  • PostgreSQL技术大讲堂 - 第31讲:SQL调优技巧
     PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUGPG技术大讲堂。 第31讲:SQL调优技巧 第31讲预告:10月28日(周六)19:30-20:30......
  • rust中使用zip crate解压.gz文件
    添加所需的库到Cargo.toml文件中:zip="0.6.6"直接上代码,都在酒里了.usestd::fs::File;usestd::io::{Read,Write};usestd::process::exit;usestd::path::{Path,PathBuf};usezip::ZipArchive;fnmain(){//======设置输入输出路径======letzip_......
  • 开源GTKSystem.Windows.Forms,在这里更新预告
    开源GTKSystem.Windows.Forms,在这里更新预告gitee码云开源地址:https://gitee.com/easywebfactory/gtksystem-windows-formsgithub网络有墙,暂时就不上github了。目前利用空余时间持续开发更新,欢迎留言交流。更新预告:增加Timer类修改按钮的背景图属性生成方式实现控件的Pain......
  • 如何在Vue组件中访问Vuex store中的状态?
    在Vue组件中访问Vuexstore中的状态,可以通过计算属性(computedproperties)或者直接通过$store.state来实现。下面是两种常见的方法:1:使用计算属性(computedproperties):在Vue组件中,定义一个计算属性来获取Vuexstore中的状态。计算属性会根据状态的变化自动更新。exportdefaul......
  • 【刷题笔记】93. Restore IP Addresses
    题目Givenastringcontainingonlydigits,restoreitbyreturningallpossiblevalidIPaddresscombinations.Example:Input:"25525511135"Output:["255.255.11.135","255.255.111.35"]题目大意给定一个只包含数字的字符串,复原它并返回所有可能的IP地址格式。......
  • startservice 返回5
    返回值返回以下列表中列出的值之一,或指示错误的任何其他值。有关其他错误代码,请参阅 WMI错误常量 或 WbemErrorEnum。有关常规 HRESULT 值,请参阅 系统错误代码。0已接受该请求。1不支持该请求。2用户没有必要的访问权限。3由于其他正在运行的服务依赖......
  • google test 之 TEST_F详解
    一、基本概念:googletest三种测试用例写法:TEST(test_suite_name,test_name)第一种是最基本写法:#include<gtest/gtest.h>intadd(inta,intb){returna+b;}TEST(testAdd,testArrayAdd){inta[]={1,2,3,4,5};intb[]={5,6,7,8,9};int......