ST算法:基于倍增原理的算法。
对数列的每一个元素,我们将它分成单独的区间,将其作为第一组,再对每两个元素分成单独的区间,作为第二组,再对四个元素分成单独区间,依次类推。我们可以看到,如果多个小区间完全覆盖一个大区间(可以重叠但不超过),则大区间的最值一定和这些小区间的最值相等。
该算法和树形数据结构相当,子节点将自己的最值依次向上传给父节点,在对区间查询时,不需要和线段树一样一层层搜寻,由于每一个区间我们都是算过的,所以查询的时间复杂的仅为 O(1)。
在计算每组区间的最值时,我们采用动态规划(后续的组的值可以由前面的组得来且无后续性),定义dp[ s ][ k ], s为区间的左端点,k为区间内元素个数,k的值每次倍增,也就是k<<1,所以如果我们想要上一组的最值,那么应该以当前组的左端点开始,往右k-1格,再将左端点加上2^(k-1)得到另一个左端点,因为是倍增,所以加上1<<(k-1),得到状态转移方程:
dp[ s ][ k ] = min { dp[ s ][ k -1 ],dp[ s+1<<( k-1 ) ][ k-1 ]