题目TC: 18.2-4

分析

因为插入B树的数字是递增的,所以只有最右边一条链的节点上可能有多于一个key。
我们先关注整个B树最右下角的节点,称之为AA
当插入到第33个数字时,AA(这时候也是根)满了,然后在插入下一个数字44的时候,其分裂,变成

1
2
3

再插入44变成

1
2
3,4

注意到一个节点分裂之后(在把插入的数字塞到节点里之前),节点里还会剩下11个key。所以一个节点从上一次满到下一次满,需要插入两个数字。
AAn=3,5,7,n=3, 5, 7, \dots的时候是满的。
n=5n=5:

1
2
3,4,5

n=6n=6:

1
3
2,4
5,6

n=7n=7:

1
3
2,4
5,6,7

每个节点是在它满了之后,插入下一个数字时分裂的,即AA在插入n=4,6,8,10,12,14,16n=4, 6, 8, 10, 12, 14, 16\dots之后分裂。

接下来考虑AA的父亲,称为BB,它在n=4n=4AA首次分裂之后出现。

AA每分裂一次,相当于给BB插入一个数字。即n=4n=4时,给BB插入第一个数字,n=6n=6时,给BB插入第二个数字…
所以在AA分裂三次之后(n=8n=8之后),BB就(第一次)满了。
接下来每给BB插入两个数字,即AA每分裂两次,BB又会变满一次。所以BB是满的当n=8,12,16,20,24,n=8, 12, 16, 20, 24, \dots的时候。
同样地,BB也是在它满了之后,插入下一个数字时分裂的,即BB在插入n=9,13,17,21,25n=9, 13, 17, 21, 25\dots之后分裂。

再考虑BB的父亲CC
BB分裂一次相当于给CC插入一个数字。所以与上面类似,在n=17,25,33,n=17, 25, 33, \dots的时候CC是满的,在n=18,26,34,n=18, 26, 34, \dots的时候CC分裂。

以此类推。
对于每一个节点,它的右孩子分裂三次之后,在插入下一个数字的时候它第一次分裂。
之后它的右孩子每分裂两次,在插入下一个数字的时候它分裂一次。
用归纳法,得到第ii个节点(第11个节点是AA,第22个节点是BB…)两次分裂的间隔是2i2^i个数字。
再用SiS_i​表示第ii个节点第一次分裂的时间,有
S1=4S_1=4 Si=Si1+2×2i1+1S_i=S_{i-1}+2\times2^{i-1}+1
进而Si=2i+1+i1S_i=2^{i+1}+i-1

统计数量

如何统计插入nn个数字后的节点数量TnT_n​?
初始数量为T0=1T_0 = 1,即空树有一个节点。
对于之前我们考虑的每一个节点,它第一次作为根分裂的时候,分裂一次节点数量加22(它自己一分为二,且加了另外一个根),之后它就是不是根了,分裂一次数量加11

所以当SinS_i \le n的时候,第ii个节点对最终的数量有贡献,且贡献为11加上其分裂次数,我们知道第ii个节点在插入Si,Si+2i,Si+2×2i,Si+3×2i,S_i, S_i + 2^i, S_i+2\times 2^i, S_i+3\times 2^i, \dots时分裂,故分裂次数为其中小于等于nn的数字的个数,等于
nSi2i+1\left\lfloor\frac{n-S_i}{2^i}\right\rfloor+1
则贡献为
1+(nSi2i+1)=nSi2i+2=n2i+1i+12i+2=ni+12i\begin{aligned} 1+\left(\left\lfloor \frac{n-S_i}{2^i} \right\rfloor + 1 \right) &= \left\lfloor \frac{n-S_i}{2^i}\right\rfloor + 2\\ &=\left\lfloor\frac{n-2^{i+1}-i+1}{2^i}\right\rfloor + 2\\ &=\left\lfloor\frac{n-i+1}{2^i}\right\rfloor \end{aligned}
所以总的节点数量是1加上各个ii贡献之和,即
Tn=1+i=1[Sin](ni+12i)=1+i=12i+1+i1nni+12i=1+i=02i+2+inni2i+1\begin{aligned} T_n &= 1+\sum_{i=1}^\infty[S_i \le n]\left(\left\lfloor\frac{n-i+1}{2^i}\right\rfloor\right)\\ &=1+\sum_{i=1}^{2^{i+1}+i-1 \le n}\left\lfloor\frac{n-i+1}{2^i}\right\rfloor\\ &=1+\sum_{i=0}^{2^{i+2}+i\le n}\left\lfloor\frac{n-i}{2^{i+1}}\right\rfloor \end{aligned}

一般问题

在解决这个问题的时候,我们并没有依赖minimum degree为22这个特性,所以我们可以用同样的方法解决minimum degree为任意t2t \ge 2的情形。
类似上面的方法,用归纳法,第ii个节点分裂两次的间隔是tit^i个数字。
且第一个节点第一次分裂的时间为插入第2t2t个数字的时候,第ii个节点第一次分裂是在第i1i-1个节点分裂2t12t-1次后插入下一个数字的时候,即
S1=2tS_1 = 2t Si=Si1+(2t2)ti1+1S_i = S_{i-1} + (2t-2)t^{i-1} +1
进而
Si=i1+2t+j=1i1(2t2)tj=i+1+j=0i1(2t2)tj=i+1+(2t2)j=0i1tj=i+1+(2t2)ti1t1=2ti+i1\begin{aligned} S_i &= i-1 + 2t + \sum_{j=1}^{i-1}(2t-2)t^j\\ &=i+1 + \sum_{j=0}^{i-1}(2t-2)t^j\\ &=i+1+(2t-2)\sum_{j=0}^{i-1}t^j\\ &=i+1+(2t-2)\frac{t^i-1}{t-1}\\ &=2t^i+i-1 \end{aligned}

对于SinS_i \le n的节点,其对答案的贡献为
nSiti+2=n2tii+1ti+2=ni+1ti\begin{aligned} \left\lfloor\frac{n-S_i}{t^i}\right\rfloor+2 &= \left\lfloor\frac{n-2t^i-i+1}{t^i}\right\rfloor+2\\ &=\left\lfloor\frac{n-i+1}{t^i}\right\rfloor \end{aligned}
所以总的节点数为
Tn=1+i=1[Sin](ni+1ti)=1+i=12ti+i1nni+1ti\begin{aligned} T_n &= 1 + \sum_{i=1}^\infty [S_i \le n]\left(\left\lfloor\frac{n-i+1}{t^i}\right\rfloor\right)\\ &=1 + \sum_{i=1}^{2t^i+i-1 \le n}\left\lfloor\frac{n-i+1}{t^i}\right\rfloor \end{aligned}