“若元素会动态插删,顺序统计树用 $O(n)$ 空间换取最坏 $O(\log n)$ 的更新和 rank/select。若数据只能顺序到达,数据流分位数以受限空间返回带秩误差的近似答案。随机增…”
增强不变量 ​
每个节点
空子树大小为零。插入、删除沿祖先链更新;一次旋转只改变常数个节点的孩子关系,先更新下沉节点、再更新上升节点即可恢复不变量。
Select 与 Rank ​
令
动态中位数例子 ​
持续插入订单价格后,中位数是 Select
语义边界 ​
静态选择问题可在无序数组上线性求第
删除与旋转核对 ​
BST 删除若用后继键替换目标,再物理删除后继节点,size 应沿真正被移除节点到根的路径递减;只沿最初搜索路径更新会在后继较深时留下错误字段。红黑树修复中的每次旋转都要先保存旧子树关系,再按孩子重算两个受影响节点。
可用局部断言审计实现:每个节点随时满足 size 方程,根 size 等于集合总 multiplicity;Select
更新路径的核对方法 ​
插入键 13 后,先沿搜索路径把祖先 size 各加一,再执行平衡修复。若一次左旋以
删除含两个孩子的节点时,若实现把后继记录搬到目标节点而实际删除后继位置,应该只在后继到根的结构路径上减计数;若交换整节点,则两条路径和旋转都要核对。重复键可以“每次出现一节点”,也可以在节点内存 multiplicity;后一种定义下
Rank 与 Select 的跨根偏移也必须使用 count(v) 而不是 1。
参考资料
- Cormen et al., Introduction to Algorithms, 4th ed., Augmenting Data Structures.
- Robert Tarjan, Data Structures and Network Algorithms, SIAM, 1983.