【问题标题】:searching within a Node on a CSB+ tree在 CSB+ 树上的节点内搜索
【发布时间】:2012-09-06 02:33:41
【问题描述】:

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

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

统一方法是通过代码扩展,将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是如何产生的?

任何提示将不胜感激。此外,将我指向代码扩展知识的链接会有所帮助。

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

谢谢

【问题讨论】:

    标签: data-structures b-tree search-tree


    【解决方案1】:

    这里的重点是同一节的以下引用:

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

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

    由于大部分右子树都被最大可能的键 (L) 填充,因此我们需要的比较比平时少:

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

    根节点的右后代拥有最大可能的key,不需要检查它右边的任何节点。每个区间都需要进行 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
    

    “代码扩展”不是一个广泛使用的术语,所以我不能给你最相关的链接。我想,这和"Loop unwinding"没有太大区别。

    【讨论】:

    • 我不知道这是否是一个幼稚的问题,但您的示例给出的平均值是 2.8 而不是 2.67。
    • 我更新了我的答案。现在它正确解释了为什么我们需要 2.67 比较。
    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多