这是本人的第一篇blog
1.可持久化平衡树(可持久化WBLT)
1.1WBLT
1.1.1引入
Weight Balanced Leafy Tree,下称 WBLT,是一种平衡树,比起其它平衡树主要有实现简单、常数小的优点.它支持区间操作,而且可持久化.
Weight Balanced Leafy Tree 顾名思义是 Weight Balanced Tree 和 Leafy Tree 的结合.
Weight Balanced Tree 的每个结点储存这个结点下子树的大小,并且通过保持左右子树的大小关系在一定范围来保证树高.
Leafy Tree 维护的原始信息仅存储在树的 叶子节点 上,而非叶子节点仅用于维护子节点信息和维持数据结构的形态.我们熟知的线段树就是一种 Leafy Tree.

本文的树均指的是二叉的 Leafy Tree,即每个节点的子节点数目只能是0或2.本文中的 n,指的是树的叶子节点的数目.叶子节点数目为 n 的树,总的节点数量是 2n-1,因此,WBLT 占用的空间是 $\Theta(n) $ 的.
1.1.2基本结构及平衡度概念
本节介绍 WBLT 的基本结构,定义树的 \(\alpha\) ‑平衡的概念,并解释如何通过旋转或合并的方式维护树的平衡.
1.1.2.1节点信息
要实现一个基本的WBLT,只需要记录每个节点的如下信息:
son[x][0]、son[x][1]:左右子节点;
sz[x]:以x为根的子树的叶子结点数目;
利用 WBLT 实现平衡树,还需要在每个节点处记录与键值相关的信息:
val[x]:节点x处的键值。
因为只有叶子节点实际存储键值,所以其他节点处存储的信息是由它们的子节点合并得到的,以方便后续查询.
比如,一种常用的合并方式就是将两个子节点的键值中较大的那个存储于该节点.这样,每个节点存储的就是以它为根的子树中,所有叶子节点的键值的最大值.基于此,节点信息的更新方法如下:
void push_up(int x)
{
siz[x]=siz[son[x][0]]+siz[son[x][1]];
val[x]=val[son[x][1]];
}
1.1.2.2辅助函数
除了基本的节点信息维护外,WBLT 通常还需要实现如下辅助函数,用于内存管理:
new_node():新建节点;
del_node(x):删除节点;
new_leaf(v):新建以v为键值的叶子节点;
join(x,y):连接子树,即分别以 x、y 为左右子节点,新建节点 z;
cut(x):拆分子树,即获得节点 x 的两个子节点,并删除节点 x.
果 WBLT 的实现十分依赖于拆分和连接子树,会建立较多的新节点,并释放等量的旧节点.如果不及时回收旧的无用节点,会导致空间不再是线性的.以下是这些辅助函数的数组实现:
int new_node()
{
int x=top?pool[top--]:++tot;
son[x][0]=son[x][1]=val[x]=siz[x]=0;
return x;
}
void del_node(int& x)
{
pool[++top]=x;
x=0;
}
int new_leaf(int v)
{
int x=new_node();
val[x]=v;siz[x]=1;
return x;
}
int join(int x,int y)
{
int z=new_node();
son[z][0]=x;son[z][1]=y;
push_up(z);
return z;
}
auto cut(int& z)
{
int x=son[z][0],y=son[z][1];
del_node(z);
return make_pair(x,y);
}
封装好这些辅助函数后,数组实现和指针实现在后续函数中就没有区别了.
1.1.2.3平衡的概念
对于一个树,可以定义它在一个非叶节点\(x\)处的平衡度为:
\(\rho(x)=\displaystyle \frac{min\{w(T_{left(x)}),w(T_{right(x)})\}}{w(T_x)}\)
其中,\(T_x\)表示以\(x\)为根的子树,\(w(·)\)表示子树的权重(它的叶子节点数目),而\(left(x)\)和\(right(x)\) 分别表示 \(x\) 的左右子节点,特别的,叶子节点处规定\(\rho(x)=\displaystyle \frac{1}{2}\)
对于\(\alpha\in(0,1/2]\),如果某个节点 \(x\) 处平衡度 \(\rho(x)\ge\alpha\),就称该节点是 \(\alpha‑平衡\) 的.如果树的每个节点处都是 \(\alpha\)‑平衡的,就称树是 \(\alpha\)‑平衡 的.这样的树的集合记作 \(BB[\alpha]\).一个树是 \(\alpha\)‑平衡 的,当且仅当它本身是 \(\alpha\)‑平衡的,且它的左右子树都是 \(\alpha\)‑平衡的或者它是叶子节点.
树是 \(\alpha\)‑平衡的,有一个显然的好处是,它的高度是 \(O(\log n)\) 的.这是因为,从叶子节点每向根移动一步,子树所包含的叶子节点数目就至少扩大到原来的 \(1/(1-\alpha)\) 倍,因此只能移动\(O(\log_{\frac{1}{1-\alpha}}n) = O(\log n)\) 次.这就保证了在 \(\alpha\)‑平衡的树中,单次查询的复杂度总是严格 \(O(\log n)\) 的,且算法的常数与 \(\log(1/(1-\alpha))\)(以 2 为底)正相关.当 \(\alpha\) 位于下文提供的合理范围内时,这个常数大致为 \(2\sim 3.5\).
为了方便,下文中 \(x\) 的权值 \(w_x\) 用 \(x\) 表示
1.1.3复杂度证明

一种朴素的平衡维护策略是将 \(x\) 旋转到根节点处,这样它原先的右子节点 \(w\) 就和 \(y\) 一起成为了新树的右子节点,而它原先的左子节点 \(z\) 成为了新树的左子节点.这相当于将原来的树左侧中 \(w\) 的权重移动到它的右侧.如果 \(w\) 的权重合适,这样的操作就可以恢复树的平衡.这样得到的树如图中右侧的树所示.
但是,如果 \(w\) 本身过重,这样的操作可能移动了太多的权重到右子树,从而使得新树中左子树过轻,即 \(z<\alpha(x+y)\).对于这种情形,因为子树 \(z\) 和子树 \(y\) 的权重都太小,只能考虑将 \(w\) 分拆为两个子树,分别与 \(z\) 和 \(y\) 连接,成为新树的两个子树.这相当于首先将节点 \(w\) 旋转到节点 \(x\) 处,再将它旋转到根节点处.同样,可以期待这样得到的树能够达到平衡,形态如图中上方的树所示.
这两种旋转的策略分别称为单旋和双旋.单旋和双旋策略的选取,主要取决于子树 \(w\) 相对于子树 \(x\) 的比重,即存在阈值 \(\beta\),使得
- 当 \(w\le\beta x\) 时,应选取单旋策略;
- 当 \(w>\beta x\) 时,应选取双旋策略.
此处证明当\(\alpha\in(\frac{2}{11},1-\frac{\sqrt{2}}{2}]\approx(0.182,0.292],\beta=\frac{1}{2-\alpha}\)时,复杂度正确
需要证明的是,如果树在单次插入或删除后失衡,可以通过上述策略恢复它的平衡.结合上述图示,令
\[\rho_1=\frac{x}{x+y},\rho_2=\frac{w}{x},\rho_3=\frac{v}{w}
\]
则有 \(\rho_1<\alpha\le\rho_2,\rho_3\le1-\alpha\) ,此处还有一个隐藏条件,是关于\(\rho_1\)的取值范围的:
\[\because \rho_1=\frac{y}{x+y}\\
\therefore y=\rho_1(x+y)=\rho_1x+\rho_1y\\
\therefore \rho_1x=(1-\rho_1)y\\
\therefore x=\frac{1-\rho_1}{\rho_1}y\\
\]
- 如果失衡是由于插入单个元素引起的,则应该是插入到了 \(x\) 为根的子树中导致 \(y\) 过轻,所以插入之前的\(\rho_1\)应为\(\frac{y}{x-1+y}\)该平衡度合法,所以有:
\[\frac{y}{x-1+y}\ge\alpha \\
将其x=\frac{1-\rho_1}{\rho_1}y带入其中可得:\\
\frac{y}{\frac{1-\rho_1}{\rho_1}y+y-1}\ge\alpha\\
\therefore \frac{y}{\frac{1}{\rho_1}y-1}\ge\alpha\\
\therefore y\ge\frac{\alpha}{\rho_1}y-\alpha\\
\therefore \frac{\alpha+y}{y}\ge\frac{\alpha}{\rho_1}\\
\therefore \rho_1\ge\frac{\alpha y}{\alpha+y}\ge\frac{\alpha}{\alpha+1}
\]
- 如果失衡是由于删除单个元素引起的,则应该是删除了 \(y\) 为根的子树中的元素导致 \(y\) 过轻,所以插入之前的\(\rho_1\)应为\(\frac{y+1}{x+y+1}\)该平衡度合法,所以有:
\[\frac{y+1}{x+y+1}\ge\alpha\\
将其x=\frac{1-\rho_1}{\rho_1}y带入其中可得:\\
\frac{y+1}{(1+\frac{1-\rho_1}{\rho_1})y+1}\ge\alpha\\
\therefore \frac{y+1}{\frac{1}{\rho_1}y+1}\ge\alpha\\
\therefore y+1\ge\frac{\alpha}{\rho_1}y+\alpha\\
\therefore y\rho_1+\rho_1\ge\alpha y+\alpha\rho_1\\
\therefore (y+1-\alpha)\rho_1\ge\alpha y\\
\therefore \rho_1\ge\frac{\alpha y}{y+1-\alpha}\ge\frac{\alpha}{2-\alpha}
\]
因为对于 \(0<\alpha<\frac{1}{2}\),总有 \(\frac{\alpha}{2-\alpha}<\frac{\alpha}{1+\alpha}\),所以删除元素会导致比增添元素更严重的失衡,尤其是对于树的规模很小的情形,考虑最差情况
所以\(\rho_1\)有范围:\(\frac{\alpha}{2-\alpha}\le\rho_1<\alpha\)。
接下来,恢复平衡的操作分为两种情形:
情形一:$w$没有过重,即$\rho_2\le\beta$时,单旋
首先$\rho_1,\rho_2,\rho_3$的范围为:
$
\frac{\alpha}{2-\alpha}\le\rho_1<\alpha,
\alpha\le\rho_2\le\beta=\frac{1}{2-\alpha},
\alpha\le\rho_3\le1-\alpha
$
$$
\begin{align*}
\frac{w+y}{x+y}&=\frac{w}{x+y}+\frac{y}{x+y}\\
&=\frac{x}{x+y}·\frac{w}{x}+\frac{y}{x+y}\\
&=(1-\frac{y}{x+y})\frac{w}{x}+\frac{y}{x+y}\\
&=(1-\rho_1)\rho_2+\rho_1
\end{align*}\\
\because z 与 w+y 平衡\\
\therefore \alpha\le\frac{w+y}{x+y}=(1-\rho_1)\rho_2+\rho_1\le1-\alpha\\
\because(1-\rho_1)为正\\
\therefore \rho_2越大,\frac{w+y}{x+y}越大\\
\because (1-\rho_1)\rho_2+\rho_1=(1-\rho_2)\rho_1+\rho_2,(1-\rho_2)为正\\
\therefore \rho_1越大, \frac{w+y}{x+y}越大\\
\therefore 当\rho_1,\rho_2均取最大值时,\frac{w+y}{x+y}有最大值(1-\alpha)·\frac{1}{2-\alpha}+\alpha(取不到)\\
同理当\rho_1和\rho_2同时取最小值时,\frac{w+y}{x+y}有最小值(1-\frac{\alpha}{2-\alpha})·\alpha+\frac{\alpha}{2-\alpha}\\
\therefore (1-\frac{\alpha}{2-\alpha})·\alpha+\frac{\alpha}{2-\alpha}\le\frac{w+y}{x+y}<(1-\alpha)·\frac{1}{2-\alpha}+\alpha\\
左式在\alpha\in(0,1]时大于等于\alpha,右式在\alpha\in(0,1-\frac{\sqrt{2}}{2})时小于1-\alpha\\
\therefore \alpha\in(0,1-\frac{\sqrt{2}}{2})\\
\begin{align*}
\frac{y}{w+y}&=\frac{\frac{y}{x+y}}{\frac{w+y}{x+y}}\\
&=\frac{\rho_1}{(1-\rho_1)\rho_2+\rho_1}\\
\end{align*}\\
\because w与y平衡\\
\therefore \alpha\le\frac{y}{w+y}=\frac{\rho_1}{(1-\rho_1)\rho_2+\rho_1}\le1-\alpha\\
\begin{align*}
\because \frac{\rho_1}{(1-\rho_1)\rho_2+\rho_1}&=\frac{\rho_1}{\rho_1+\rho_2-\rho_1\rho_2}\\
&=\frac{1}{1+\frac{\rho_2}{\rho_1}-\rho_2}\\
\end{align*}\\
\therefore \rho_1越大,分母越小,原式越大\\
\because (1-\rho_1)为正\\
\therefore \rho_2越小,分母越小,原式越大\\
\therefore \rho_1取最大值,\rho_2取最小值时,原式取最大值\frac{\alpha}{(1-\alpha)\alpha+\alpha}\\
当\alpha\in(0,\frac{3-\sqrt{5}}{2}),该值小于1-\alpha
$$
$$
除了删除元素且y=1的情形外,都有\\
\rho_1\ge min\{\frac{\alpha}{1+\alpha},\frac{2\alpha}{3-\alpha}\}=\frac{2\alpha}{3-\alpha}\\
由上同理可得,\rho_1取最小值,\rho_2取最大值时,\frac{y}{w+y}最小\\
\therefore \frac{y}{w+y}\ge\frac{\frac{2\alpha}{3-\alpha}}{(1-\frac{2\alpha}{3-\alpha})·\frac{1}{2-\alpha}+\frac{2\alpha}{3-\alpha}}\\
当\alpha\in(0,\frac{1}{2})时,原式大于\alpha\\
最后,考虑剩余情形,即删除元素且y=1时\\
最可能失衡的情况发生在x最大且w最大的情况此时\\
\begin{align*}
\frac{y}{x+y}&\ge\frac{\alpha}{2-\alpha}\\
\therefore \frac{1}{x+1}&\ge\frac{\alpha}{2-\alpha}\\
\therefore \alpha x+\alpha&\le2-\alpha\\
\therefore \alpha x&\le 2-2\alpha\\
\therefore x&\le \left \lfloor\frac{2}{\alpha}\right \rfloor -2\\
\end{align*}\\
\therefore 最有可能失衡的情况为x=\left \lfloor\frac{2}{\alpha}\right \rfloor -2,w=\left \lfloor\beta x\right \rfloor\\
树可以恢复平衡当且仅当\\
\begin{align*}
&\frac{1}{1+\left \lfloor\beta x\right \rfloor}\ge \alpha\\&\Leftrightarrow \left\lfloor\beta x\right\rfloor\le \left\lfloor\frac{1}{\alpha}\right\rfloor-1\\
&\Leftrightarrow \left\lfloor\beta x\right\rfloor<\left\lfloor\frac{1}{\alpha}\right\rfloor\\
&\Leftrightarrow x<\left\lfloor\frac{2}{\alpha}\right\rfloor-1,此式恒成立
\end{align*}
$$
情形二:$w$ 过重,即 $\rho_2>\beta$时,双旋
此时,$\rho_1,\rho_2,\rho_3$的范围为:
$
\frac{\alpha}{2-\alpha}\le\rho_1<\alpha,
\beta=\frac{1}{2-\alpha}<\rho_2\le1-\alpha,
\alpha\le\rho_3\le1-\alpha
$
$$
\begin{align*}
\frac{z+u}{x+y}&=\frac{x-v}{x+y}\\
&=\frac{x}{x+y}-\frac{v}{x+y}\\
&=\frac{x}{x+y}-\frac{x}{x+y}·\frac{w}{x}·\frac{v}{w}\\
&=1-\rho_1-(1-\rho_1)\rho_2\rho_3
\end{align*}
$$