ST算法

ST算法是一种优化查询连续数最小值和最大值的技术,通过空间换时间将查询时间复杂度降低到O(1)。本文介绍了ST算法的基本原理,包括从直接查找、线段树到ST算法的演进,以及如何动态生成二维数组实现高效查询。给出了ACM竞赛题目119的一个解决方案,并提供了C++实现代码示例。
摘要由CSDN通过智能技术生成
ST算法
总的来说 ST算法是一种采用空间换时间的算法,最后达到的目的是将查询连续数的最小值和最大值的时间优化为O(1)

从查询连续数的最小值和最大值这个问题起步,
首先,我们考虑直接算,如果查询m-n,    那么我们需要比较至少n-m次,最后的时间复杂度为O(n)这样的情况肯定是有问题,尤其是数据上升到了上万  上百万,另外查询次数的增加也会出问题

然后我们可以考虑使用线段树,我们可以将线段树的每个节点定义为子树中的最小值和最大值,这样如果我们需要检查一段数据的最小值的时候只需要提取能完全包含这段线段的节点的就行了,时间复杂度到了 O(log2 n)
比起直接查找有了一定的优化,但是还不够,    主要是在生成线段树和查询线段树的过程中的开销都很大

最后就要看ST算法。ST算法基于的原理是:如果我们需要查R-L  上的最小值,那么定义一个Len ,2Len >(L-R+1),这样我们找min(r,l)  等价于找  min(min(R,R+Len-1),min(L-Len+1,l)),这里限定一个条件Len  必须是2的倍数。
如果我们在查询前将min的数据全部生成的话
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值