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的数据全部生成的话
总的来说 ST算法是一种采用空间换时间的算法,最后达到的目的是将查询连续数的最小值和最大值的时间优化为O(1)
从查询连续数的最小值和最大值这个问题起步,
首先,我们考虑直接算,如果查询m-n,
然后我们可以考虑使用线段树,我们可以将线段树的每个节点定义为子树中的最小值和最大值,这样如果我们需要检查一段数据的最小值的时候只需要提取能完全包含这段线段的节点的就行了,时间复杂度到了 O(log2 n)
比起直接查找有了一定的优化,但是还不够,
最后就要看ST算法。ST算法基于的原理是:如果我们需要查R-L
如果我们在查询前将min的数据全部生成的话