浅谈算法-简单倍增及st表的应用

本文介绍了倍增算法在解决区间最值查询(RMQ)和最近公共祖先(LCA)问题上的应用。通过构建稀疏表(ST表)实现O(nlogn)预处理和O(1)查询复杂度,详细阐述了基于RMQ和不基于RMQ的两种ST算法,并给出了实际题目案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       这篇文章是以前写的当时还用着pascal,还请见谅——蒟蒻mqy

       倍增是一种思想,每次将考虑的范围扩大或减少一倍从而达到加速的效果,将某一步的O(n)优化到O(logn)


已经接触过的倍增:


快速幂(每次将指数缩小一倍)

归并排序(每次将排序区间缩小一倍)


倍增在st表上的实现:

St表又称稀疏表,f[I,j]是对于第i个点第2^j个状态的诠释

例题(RMQ问题-区间最值查询)

输入n,再输入n个数,进行m次询问,对于每次询问求出x,y之间的最小/最大值(n,m<=100000)

此时在不借助高级数据结构的情况下似乎没办法解决了,但其实可以通过倍增思想来将复杂度优化到(nlogn+m)

倍增在st表上的实现

以区间最大值为例

F[I,j]表示第i个数开始2^j个数当中的最大值

易得:

f[I,0]=a[i]

f[I,j]=min(f[I,j-1],f[i+2^(j-1),j-1])

这样做很明显是正确的,因为除2^0以外任何的2的幂都是偶数都可以分成已知的两部分

在求出f[I,j]后对于每一个大小不是2的整次幂的区间的RMQ有什么帮助呢?

这里给出一种O(1)回答每一个询问的方法,常规的st表的查询方法要O(logn)

K=trunc(ln(y-x+1)/ln(2))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值