关于构建
层数与管辖长度的对应关系
ST表的一个关键设计在于每一层对应着该层元素掌管的区间长度. 这种对应关系直接影响了ST表的构建方式和查询效率.
线性增长 (1×层数) 的构建方式
如果采用1×层数的方式构建ST表, 对于一个数组[1, 2, 3, 4, 5, 6, 7, 8], 构建结果如下:
1 | 1 2 3 4 5 6 7 8 |
这种构建方式的问题在于:
- 预处理时间复杂度为$O(n^2)$
- 没有利用问题的可重复贡献性质
指数增长 (2^层数) 的构建方式
更优的方案是采用2^层数的方式构建ST表, 同样的数组构建结果如下:
1 | 第0层:1 2 3 4 5 6 7 8 (每个元素负责2^0=1个元素) |
这种设计带来了显著优势:
- 预处理时间复杂度降低到$O(n \log n)$
- 查询时可以通过$O(1)$时间组合两个区间得到任意区间答案
为什么选择2作为基数?
1. 区间覆盖的完备性
$2^j$ 的设计保证了任何区间都能被恰好两个子区间完全覆盖. 例如,查询区间$[2,8]$可以通过:
- 从第2层选择$[2,5]$ (长度为$4$)
- 从第2层选择$[5,8]$ (长度为$4$)
两个区间组合而成, 恰好覆盖$[2,8]$且没有遗漏或过多重叠.
相比之下, 如果使用$3^j$作为基数, 以数组[1,2,3,4,5,6,7,8,9]为例:
1 | 第0层:1 2 3 4 5 6 7 8 9 |
查询$[2,8]$时, 无法找到两个长度为$1$/$3$/$9$的区间来完全覆盖, 至少需要三个区间才能完成, 这大大增加了查询逻辑的复杂性.
2. 计算效率优势
$2^j$的计算可以通过位移操作高效实现, 不浪费性能.
3. 对数级别的层数
以$2$为底的对数增长使得层数控制在$\log_{2} n$, 比使用更大的基数 (如$3$) 能更好地平衡预处理和查询的开销.
我很可爱,请给我钱
- 本文链接: https://www.zh314.xyz/2025/07/05/ST表的为什么/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。