[数据结构与算法-13]ST表】的更多相关文章

ST表 主要用来快速查询静态数据区间最大值 思路 数组\(A[i][j]\)存储数列\(\{a_i\}\)中区间\(i \in [i, i+2^j)\)的最大值 查询时只需要查询\(max\{A[i][k], A[j-2^k+1][k]\}\)即可,保证\(2\times2^k \geq j - i\)即可 预处理使用动态规划的思想 位运算勤加括号! 位运算勤加括号!! 位运算勤加括号!!! P3865 [模板]ST表 题目背景 这是一道ST表经典题--静态区间最大值 请注意最大数据时限只有0.…
[算法模板]ST表 ST表和线段树一样,都能解决RMQ问题(范围最值查询-Range Minimum Query). 我们开一个数组数组\(f[maxn][maxn\log_2]\)来储存数据. 定义\(f[i][j]\)代表从\(i\)开始的\(2^{j}\)位这个区间的最大值. 初始化 因为\(f[i][0]=a[i]\),所以有: \[ f[i][j]=max(f[i][j-1],f[i+2^{j-1}][j-1]) \] 通过这个转移方程即可构造出\(f\). 查询 查询区间\([l,r…
Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计算机内存都可以满足. 为了尽可能地存取每个员工的记录,使用工号从1(公司创业者)到1000(最近雇佣的工人).将工号作为关键字(事实上,用其他作为关键字完全没有必要).即使员工离职不在公司,他们的记录也是要保存在数据库中以供参考,在这种情况下需要使用什么数据结构呢? A: 一种可能使用数组,每个员工…
WZJ的数据结构(三) 难度级别:B: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的整数组A,M次询问.每次询问给你i,j两个参数,求Ai至Aj中最大的数. 输入 第一行为两个正整数N,M.第二行为N个整数Ai.接下来M行为询问.  输出 对于每个询问输出答案.  输入示例 6 51 -2 3 4 -6 71 21 11 51 64 6 输出示例 11477 其他说明 1<=N<…
今天要介绍一个这样的数据结构: 单向链接 有序保存 支持添加.删除和检索操作 链表的元素查询接近线性时间 ——跳跃表 Skip List 一.普通链表 对于普通链接来说,越靠前的节点检索的时间花费越低,反之则越高.而且,即使我们引入复杂算法,其检索的时间花费依然为O(n).为了解决长链表结构的检索问题,一位名叫William Pugh的人于1990年提出了跳跃表结构.基本思想是——以空间换时间. 二.简单跳跃表(Integer结构) 跳跃表的结构是多层的,通过从最高维度的表进行检索再逐渐降低维度…
2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j -1]的最大或者最小值 ST分为两个部分 1.nlogn的预处理 预处理主要用到了动态规划,二分区间每个区间长度为 2 ^ (j -1)找到一个递推关系: F[i][j] = min(F[i][j - 1],F[i + (1 << (j - 1))][j - 1]); 2.查询部分更为巧O(1)得…
解题关键:rmq模板题,可以用st表,亦可用线段树等数据结构 log10和log2都可,这里用到了对数的换底公式 类似于区间dp,用到了倍增的思想 $F[i][j] = \min (F[i][j - 1],F[i + 1 <  < (j - 1)][j - 1])$ #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath&…
题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么它们就会被认为是一对友好城市. Byteland 的交通系统十分特殊,第i 天只有编号在[li, ri] 的单向公路允许通行,请写一个程序,计算每天友好城市的对数. 注意:(a, b) 与(b, a) 没有区别. 70 Kosarajo算法 这是一个区别于tarjan算法的求强连通分量的算法. 流程…
想学习一下LCA倍增,先 水一个黄题 学一下ST表 ST表 介绍: 这是一个运用倍增思想,通过动态规划来计算区间最值的算法 算法步骤: 求出区间最值 回答询问 求出区间最值: 用f[i][j]来存储从第 j 个点开始,向后 2 ^ i - 1 个点中的最值(包括本身) 利用二分法的思想,将区间 [ j,j +(2 ^ i)- 1 ] 平均(大概)分成两半 可以算出,区间 [ j,j +(2 ^ i)- 1 ] 的长度为 2 ^ i 所以一半的长度为 2 ^ i - 1 那么分成的两个区间就为 […
st表是一种基于倍增思想的DP. 用于求一个数列中的某个区间的最大/最小值. 用st[i][j]表示从第i个开始往后2^j个点,最大的是多少. 我们令k[i]表示2^i等于多少 那么有转移方程 st[i][j] = max(st[i][j - 1], st[i + k[i - 1]][j - 1]); 为什么呢? 例如这幅图,显然黑色块的答案可以由合并下面两块得到. 那如果查询的时候不是2的整次幂怎么办? 这其实是没有问题的,你可以观察下图…… 因为小区间有重叠部分并不影响,因此完全可以用稍大一…
RMQ RMQ (Range Minimum Query),指求区间最小值.普通的求区间最小值的方法是暴力. 对于一个数列: \[ A_1,~ A_2,~ A_3,~ \cdots,~ A_n \] 对于一个给定的区间\([l, ~r], ~1≤ l ≤r ≤ n\),\(\min \{A_l, A_{l + 1}, \cdots,A_r\}\)的计算就是RMQ问题. 此解法为\(\text{Sparse-Table}\)解法,简称\(ST\)表. 预处理:预处理为对数据进行\(n\log n\…
顺序表作为数据结构的开端,说明这里面很多基础要学,初学者一开始都会混淆,今天我们来一步一步来建立一个完整的顺序表,可以任我们控制的顺序表,首先先定义一个顺序表 /* Note:Your choice is C IDE */ #include "stdio.h" #define MAXSIZE 100 typedef struct /*结构体的格式*/ { int data[MAXSIZE]; int last; }Seqlist; /*顺序表的名称*/ 定义在主函数定义一个指向这个顺序…
哈希表 学习笔记 参考翻译自:<复杂性思考> 及对应的online版本:http://greenteapress.com/complexity/html/thinkcomplexity004.html 使用哈希表可以进行非常快速的查找操作,查找时间为常数,同时不需要元素排列有序 python的内建数据类型:字典,就是用哈希表实现的 为了解释哈希表的工作原理,我们来尝试在不使用字典的情况下实现哈希表结构. 我们需要定义一个包含 键->值 映射 的数据结构,同时实现以下两种操作: add(k…
概述:用倍增法求区间最值的离线算法,O(nlogn)预处理,O(1)访问. 预处理: 状态:st[i][j]:[i,i+2^j)之间的最值 状态转移:如果j等于0,st[i][j]=a[i] 如果j大于0,st[i][j]=max(st[i][j-1],st[i+2^(j-1)][j-1])或st[i][j]=min(st[i][j-1],st[i+2^(j-1)][j-1]) 访问: 求[l,r]区间里的最值 k=floor(log(r-l+1)) ans=max(st[l][k],st[r-…
POJ2019 我们其实是很有必要把ST算法拓展到二维的,因为二维的RMQ问题还是不少的 int N,B,K; ]; int val[maxn][maxn]; ][]; ][]; 这里的N是方阵的长宽,此处是正方形题目,然后mm是预处理出来的,方便计算指数 dpmin和dpmax就是预处理数组了 然后看一下开局预处理: void initRMQ(int n,int m) { ;i<=n;i++) ;j<=m;j++) dpmin[i][j][][]=dpmax[i][j][][]=val[i]…
#include <stdio.h> #define maxSize 100 //定义整型常量maxSize值为100 /*顺序表的结构体定义*/ typedef struct SqList { int data[maxSize]; //存放顺序表元素的数组 int length; //存放顺序表的长度 }SqList; //顺序表类型的定义 /*单链表节点定义*/ typedef struct LNode { int data; //data中存放节点数据域 struct LNode *ne…
一.什么是顺序表: 线性表的两种基本的实现模型: 1.将表中元素顺序地存放在一大块连续的存储区里,这样实现的表称为顺序表(或连续表).在这种实现中,元素间的顺序关系由它们的存储顺序自然表示. 2.将表中元素存放在通过链接构造起来的一系列存储模块里,这样实现的表称为链接表,简称链表. 二.顺序表两种基本形式: 三.顺序表结构: 四.实现方式: 五.增加元素: a. 尾端加入元素,时间复杂度为O(1) b. 非保序的加入元素(不常见),时间复杂度为O(1) c. 保序的元素加入,时间复杂度为O(n)…
顺序表等相关概念请自行查阅资料,这里主要是实现. 注: 1.顺序表C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简单函数,可自行添加功能: 4.可用C++封装,得知STL中vector原理. 顺序表容量. #define CAPACITY 20 //容量 顺序表结构体. typedef struct { int *m_pHead; //指向数组头 int m_iSize; //大小 int m_iCapacity; //容量 }STABLE; 部分…
线性表是一种简单的数据类型,它是具有相同类型的n个数据元素组成的有限序列.形如如A0,A1,...,An-1.大小为0的表为空表,称Ai后继Ai-1,并称Ai-1前驱Ai. printList打印出表元素,makeEmpty置空表,find返回某一项首次出现的位置,insert和remove一般是从表的某个位置插入和删除某个元素:而findKth则返回某个位置上的元素,next和previous会取一个位置作为参数返回前驱元和后继元的值. 表的数组实现 对表的所有操作都可以通过数组实现.数组的存…
时间为O(N*logN). 归并排序的一个缺点是它需要在存储器中有另一个大小等于被排序的数据项数目的数组.归并两个有序的数组.利用递归,不断的将数组进行二分法排序,然后进行归并即可.…
#include <stdio.h> #include <stdlib.h> #define OK 1 #define NO 0 #define MAXSIZE 20 typedef int bool; ; typedef struct { int data[MAXSIZE]; int len; } Sqlist; void initList(Sqlist *L) ///传递结点地址而已,怎么会初始链表 { L->len = ; } int findElem(Sqlist L…
介绍一种解决最近公共祖先的在线算法,st表,它是建立在线性中的rmq问题之上.   代码:   //LCA: DFS+ST(RMQ) #include<cstdio> #include<cctype> #include<iostream> using namespace std; ; int n,m,s,tot; ],f[size<<][],head[size<<],p[size<<][]; bool vis[size]; struc…
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对python相对比较熟悉,而且感觉用python实现数据结构相对容易一点.就把这个月来学到的一些,整理一下做个月底总结. 涉及到的书有<啊哈算法>.<复杂性思考>.<数据结构基础(C语言版) 第二版>.<Python Algorithms>,以及其他大牛们的网上教…
RMQ问题: RMQ(Range Minimum/Maximum Query),区间最值查询.对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值. RMQ问题可以用线段树和ST表解决. 线段树:查询复杂度O(log n) 可以修改数列中的值 ST表: 查询复杂度 O(1) 无法修改数列中的值,是在线算法 其实ST表就是个动态规划 核心思想:倍增 对于dp[i][j] ,其含义为以i为起点,长度为2^j这个区间的最大值 转移方程就是把这…
1. 前言 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手. 非线性表(树.堆),可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 非线性表中的树.堆是干嘛用的 ?其数据结构是怎样的 ? 希望大家带着这两个问题阅读下文. 2. 树 树的数据结构就像我们生活中的真实的树,只不过是倒过来的形状. 术语定义 节点:树中的每个元素称为节点,如 A.B.…
\(0.\) RMQ问题 P1816 人话翻译 给定一个长度为\(n\)的数列\(a\),然后有\(m\)组询问,每次询问一个区间\([l,r]\)的最小值. 其中\(m,n\leq10^5\) \(1.\) 暴力做法 很显然,暴力做法就是便历 \(\max\limits_{l\leq i\leq r}a_i\) .这个做法最坏时间复杂度将会高达\(O(n^2)\).很显然,这对于\(1e5\)的数据范围要炸 \(2.\) 正解 线段树 如果不知道什么是线段树,请点击这里 线段树 对于这种区间信…
可变长数组 因为数组大小是固定的,当数据元素特别多时,固定的数组无法储存这么多的值,所以可变长数组出现了,这也是一种数据结构.在Golang语言中,可变长数组被内置在语言里面:切片slice. slice是对底层数组的抽象和控制.它是一个结构体: type slice struct { array unsafe.Pointer len int cap int } 指向底层数组的指针.(Golang语言是没有操作原始内存的指针的,所以unsafe包提供相关的对内存指针的操作,一般情况下非专业人员勿…
哈希表:散列查找 一.线性查找 我们要通过一个键key来查找相应的值value.有一种最简单的方式,就是将键值对存放在链表里,然后遍历链表来查找是否存在key,存在则更新键对应的值,不存在则将键值对链接到链表上. 这种链表查找,最坏的时间复杂度为:O(n),因为可能遍历到链表最后也没找到. 二.散列查找 有一种算法叫散列查找,也称哈希查找,是一种空间换时间的查找算法,依赖的数据结构称为哈希表或散列表:HashTable. Hash: 翻译为散列,哈希,主要指压缩映射,它将一个比较大的域空间映射到…
简介 ST 表是用于解决 可重复贡献问题 的数据结构. 什么是可重复贡献问题? ​ 可重复贡献问题 是指对于运算 \(\operatorname{opt}\) ,满足 \(x\operatorname{opt} x=x\) ,则对应的区间询问就是一个可重复贡献问题.例如,最大值有 \(\max(x,x)=x\) ,gcd 有 \(\operatorname{gcd}(x,x)=x\) ,所以 RMQ 和区间 GCD 就是一个可重复贡献问题.像区间和就不具有这个性质,如果求区间和的时候采用的预处理…
声明:数据结构与算法系列博文参考了<天勤高分笔记>.<王道复习指导>.C语言中文网.非商业用途,仅为学习笔记总结! 第一章<绪论> 一.基本概念及入门常识  ////(一)数据结构的基本概念和术语//// . 数据 数据是信息的载体,是描述客观事物属性的数.字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合. . 数据元素 数据元素是数据的基本单位,通常作为一个整体进行考虑和处理.一个数据元素可由若干个数据项组成,数据项是构成数据元素的不可分割的最小单位.…