上跳函数也称 ST 表,是一种用于解决倍增算法中的 RMQ 问题的数据结构。RMQ,即求解一段区间中的最值,是很多算法问题的基础。
上跳函数有两个主要操作:预处理和查询。在预处理操作中,需要先对原始序列进行 ST 表构建,这个过程的时间复杂度为 O(nlogn)。在查询操作中,根据要查询的区间 L 和 R,可以进行 logn 次上跳得到结果。
上跳函数的构造基于动态规划思想,它的状态转移方程式如下:
st[i][j] = min(st[i][j-1], st[i+2^(j-1)][j-1])
其中,st[i][j] 表示区间 [i, i+2^j-1] 中的最小值。这个转移过程是一个自底向上的过程,先计算所有长度为 1 的区间(即单个元素)的最小值,然后在此基础上不断合并区间至计算出最终的 st[i][j]。这个合并区间的过程正是上跳的过程。
上跳函数最常见的应用场景是解决 RMQ 问题。如果需要快速查询区间 [L, R] 这段区间的最小值,只需要计算 logn 次上跳,便可以得到结果。
另外,上跳函数还可以用于解决区间全排名问题。这个问题要求得到一个序列中某个元素的排名,即其在整个序列中是第几大元素。通过在上跳时记录每个区间内最小值的下标,可以得到一个升序的序列。同时,在查询时需要记录序列中已经遍历的元素个数,即可计算出该元素的排名。
在解决 RMQ 问题时,倍增算法和线段树算法都可以达到和上跳函数相同的时间复杂度,即 O(nlogn)。但是,在实际问题中,问题的数据量和查询次数决定了选择不同算法的效率。如果多次查询同一个区间的最小值,ST 表的计算量只需要 O(nlogn),但是倍增和线段树需要每次都进行计算,时间复杂度相对较高。