你不会错的——这些解释是针对两个稍微不同的数据结构,它们仅在 |U| 时才会重合。是二的平方幂。在高层次上,我们试图将密钥 k 分成两半,每半约 √|U| 可能性。第一种方法直接达到了这个目的;第二个是在商用硬件上运行得更快的近似值(假设 |U| 是 2 的幂,最坏的情况是 |U| 不是正方形并且前半部分的可能性是后半部分的两倍)。选择一种方法并坚持下去。
这是 FindSuccessor(3, S) 的示例。为简单起见,我将在三个元素处降低递归。
树看起来像
min=0| aux
max=7|------->min=0|
/ | \ max=2|
/ | \ /|\
/ | \ 0 1 2
/ | \
v v v
min=0| min=3| min=6|
max=1| max=4| max=7|
/| /| /|
0 1 3 4 6 7
在根部,我们拆分 3 = (1, 0) 并检查第 1 个(中间)孩子的 max > 3。确实如此,所以我们下降到那里并使用蛮力计算答案 4。(当然,如果树有两个以上的级别,我们将递归搜索。)
一个更有趣的情况是 S = {0, 1, 3, 6, 7}。
min=0| aux
max=7|------->min=0|
/ | \ max=2|
/ | \ /|\
/ | \ 0 1 2
/ | \
v v v
min=0| min=3| min=6|
max=1| max=3| max=7|
/| / /|
0 1 3 6 7
在这里,我们检查根的第 1 个子树 {3},发现它的最大值不大于 3。我们在 aux 数据结构中找到 1 的后继,即 2,并返回第 2 个子树的最小值,即 6。