“在搜索树实例中,可用搜索树增强维护子树大小等摘要;桶密度或墓碑数则按相应区域的表示维护。重建会替换一整片内部表示,父节点指向新根后仍须自底向上修复祖先摘要。”
形式陈述
局部条件
在二叉搜索树中,为每个节点维护
并固定空子树的摘要。若
一个更强而常用的充分条件是摘要取自幺半群
直觉
局部公式让我们知道下一层摘要怎样重算;整段摘要是否保持不变,决定更新能否就此停止。子树元素数不随旋转改变,所以两节点修复足够;子树高度虽然也由孩子常数合并,却可能在旋转后改变,必须继续向祖先传播。依赖祖先上下文的绝对深度则更麻烦,子树内部许多节点都可能改变。
例子与边界
真例与反例
维护
例如子树
节点深度不是这种子树摘要:一次根旋转改变整棵子树内许多节点的深度,更新常数节点无法恢复。依赖全局中序编号的字段也须改写为相对可组合量。
正确性清单
须分别验证空孩子的单位元、重复键约定、插入路径、每种旋转、删除替换与查询循环不变量。查询公式正确不代表维护过程正确,旋转次数和报告型查询的输出量也要计入总成本。
可执行检查可在每次修改后递归重算一份慢摘要,与节点缓存值逐项比较;它适合测试维护代码,但生产算法的复杂度仍来自局部更新证明。
推论与应用
插入、旋转与删除的维护次序
插入叶
删除有两种身份:逻辑上删除键
顺序统计实例全程
树中序键为
插入 6 后,路径
可增强与不可增强的判据
子树和、最大值和同时保存长度与幂因子的定长滚动哈希可以作中序聚合,符合上述旋转不变条件;普通结构哈希会随树形变化,应继续更新祖先。绝对深度、全树中节点的全局排名依祖先上下文,一次旋转可改变线性多个值。可以改存相对偏移或使用 lazy tag,但那是新不变量,不能说原字段天然局部。
参考资料
- Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, Ch. 17.
- Robert Tarjan, Data Structures and Network Algorithms, SIAM, 1983.