首页 文章

在CSB树上的节点内搜索

提问于
浏览
1

我正在读报纸,making B+-trees cache conscious in main memory . 在 Section 3.1.2 中,作者描述了在CSB树节点内进行搜索的几种方法 .

基本方法是使用传统的while循环简单地进行二进制搜索 .

统一方法是通过 code expansion ,将while循环展开为 if-then-else 语句,假设使用了所有键 .

作者给出了以下示例,该示例展示了对具有最多9个键的节点的搜索的展开 . 节点中的数字表示在 if 测试中使用的键的位置

4
            /   \
           2     6
          / \   / \
         1   3 5   8
                  / \
                 7   9

然后是令人困惑的部分:

如果实际只存在5个键,我们可以通过3个比较来遍历这个树 . 另一方面,将最深的子树放在左边而不是右边的展开需要在一些分支上进行4次比较 .

那么为什么它需要在下面的树中进行更多的比较:

6
            /   \
           4     8
          / \   / \
         2   5 7   9
        / \
       1   3

此外,

如果我们知道我们只有五个有效密钥,我们可以硬编码一棵树,平均而言,使用2.67比较而不是3比较 .

2.67 是怎么来的?

任何提示将不胜感激 . 此外,指导我了解 code expansion 知识的链接会有所帮助 .

实际上,我不确定在纸上提问是否合适,因为在这里转录时可能遗漏了一些关键信息(问题可能需要重新格式化) . 我只是希望有人碰巧读过这篇论文 .

谢谢

1 回答

  • 1

    这里的关键点是以下同一部分的引用:

    我们在具有最大可能密钥的节点中填充所有未使用的密钥(keyList [nKeys..2d-1])

    同样重要的是,在B / CSB树中,我们不搜索节点值,而是搜索这些值之间的间隔 . 一组可能的值被5个键分成6个区间 .

    由于大多数正确的子树都填充了最大可能的键(L),因此我们需要比平常更少的比较:

    4
                /   \
               2     L
              / \   / \
             1   3 5   L
                      / \
                     L   L
    

    根节点的右后代具有最大可能的密钥,不需要检查其右侧的任何节点 . 每个区间都需要3次比较:

    interval   comparisons
    up to 1    k>4, k>2, k>1
     1..2      k>4, k>2, k>1
     2..3      k>4, k>2, k>3
     3..4      k>4, k>2, k>3
     4..5      k>4, k>L, k>5
     5..L      k>4, k>L, k>5
    

    如果我们在左边放置最深的子树,我们有一棵树,非空节点放在一层更深:

    L
                /   \
               4     L
              / \   / \
             2   5 L   L
            / \
           1   3
    

    在此树中搜索节点“1”需要将密钥与4个不同的节点进行比较:L,4,2和1 .

    如果我们知道我们只有五个有效密钥,那么我们有以下树:

    2
                /   \
               1     4
                    / \
                   3   5
    

    在这里,我们可以安排比较,平均得出2.67比较:

    interval   comparisons
    up to 1    k>2, k>1
    1..2       k>2, k>1
    2..3       k>2, k>4, k>3
    3..4       k>2, k>4, k>3
    4..5       k>2, k>4, k>5
    5..L       k>2, k>4, k>5
    

    "Code expansion"不是一个广泛使用的术语,所以我不能给你最相关的链接 . 我认为,这与"Loop unwinding"没有太大区别 .

相关问题