van Emde Boas Tree中的高位和低位

sg1*_*sg1 1 tree bits data-structures van-emde-boas-trees

我试图理解vEB树的概念.

在一个例子中:我假设宇宙集U = {0,1,2,3 ...... 8}.所以大小是9.

现在让我们取一个子集S = {0,1,3,4,6,7}.

对于一个操作FindSuccessor(3,S); 我需要知道子集S中的最小元素> 3,我需要知道元素的高位和低位,即3.

一个解释是它的前半部分和后半部分,分别将结果00和11分别设为高和低.

另一个说:

high = Floor [element/sqrt(| U |)] = Floor [3/sqrt(9)] = Floor [1] = 1;

low = element%sqrt(| U |)= 3%sqrt(9)= 0;

请解释我哪里出错了?

Per*_*Per 6

你不会出错 - 解释是针对两个略有不同的数据结构,只有在| U |时才会重合 是2的平方幂.在较高的层面上,我们试图将一个关键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
Run Code Online (Sandbox Code Playgroud)

在根部,我们分裂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
Run Code Online (Sandbox Code Playgroud)

在这里,我们研究了根的树1号,{3},并发现它的最大不大于3,我们发现1 AUX数据结构,这是2的继任者,并返回二路子树的分,这是6.