【问题标题】:High and Low bits in van Emde Boas Treevan Emde Boas Tree 中的高位和低位
【发布时间】:2011-12-09 13:48:02
【问题描述】:

我试图理解 vEB 树的概念。

举个例子: 我假设一个全集 U = {0, 1, 2, 3 ..... 8}。所以大小是 9。

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

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

一种解释是它的前半和后半位,将结果 00 和 11 分别作为高和低。

另一个说:

高 = 楼层 [元素/sqrt(|U|)] = 楼层 [3/ sqrt (9)] = 楼层 [1] = 1;

低 = 元素 % sqrt(|U|) = 3 % sqrt (9) = 0;

请解释我哪里出错了?

【问题讨论】:

    标签: data-structures tree bits van-emde-boas-trees


    【解决方案1】:

    你不会错的——这些解释是针对两种略有不同的数据结构,它们仅在 |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 个(中间)孩子的最大值是否 > 3。确实如此,所以我们下降到那里并使用蛮力计算答案 4。(Of当然,如果树有两个以上的层级,我们会递归搜索。)

    一个更有趣的情况是 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。

    【讨论】:

    • 谢谢 :) 你能解释一下如何在上面的例子中使用任何一种方法获取 FindSuccessor (3, S) 吗?我在理解它背后的算法时遇到了一些麻烦。
    • @sg1 好的,添加了几个例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 2012-03-18
    相关资源
    最近更新 更多