重量平衡树学习笔记

重量平衡树

定义

一棵单次操作影响最大子树大小均摊/期望较小的平衡树

性质

显然,根据定义,我们能支持在平衡树上维护一些与子树有关的信息

在重量平衡树上,我们当做旋转操作后,对其进行暴力重构的复杂度可以接受

在OI领域,我们一般常用的重量平衡树非旋的替罪羊树或者基于旋转的treap

treap

重量平衡分析

对于插入操作,不妨设点 xx 最终旋转到了祖先 pp,那么代表点 xx 的权值是子树 pp 中最小的

概率为 1sizp\frac 1 {siz_p},重构一次整个子树 pp 代价为 sizpsiz_p 故期望代价为 11

又因为treap的期望高度为 lognlogn ,则期望 lognlogn 次代价,故期望复杂度为 O(logn)O(logn)

对于删除操作,考虑直接重构子树 xx

由于点的期望高度是 lognlogn,易得点的期望子树大小为 lognlogn

所以期望复杂度为 O(logn)O(logn)

动态下标

对于平衡树上的两点比较大小(并非容易比较的简单权值),普通平衡树是 O(logn)O(logn)

重量平衡树通过维护动态下标可以做到 O(1)O(1) 查询

对于每一个点赋予一个实数区间 (l,r)(l,r),其左儿子分配 (l,l+r2)(l,\frac{l+r}2),右儿子 (l+r2,r)(\frac {l+r}2,r)

对于旋转操作每次给子树内重新分配下标,可通过比较两点区间中点比较大小

平衡树套树

重量平衡树支持套上维护子树信息的其它树,例如线段树

复杂度是一般是 O(nlog2n)O(nlog^2n)