【问题标题】:B+ tree with variable length keys具有可变长度键的 B+ 树
【发布时间】:2013-04-29 01:32:19
【问题描述】:

在 B+ 树的常见实现中,我们可以假设键具有固定长度(例如 25 个字节)。然后我们可以定义每个节点必须有一个最小数量的键和一个最大值。

如果我希望树接受可变长度的键,我应该修改什么?如果我说该节点必须至少有 2 个键,但我尝试插入的键太大以至于它不适合保存该节点的 Block,该怎么办?

【问题讨论】:

  • 如果 B+tree 没有在一个块中至少按两个分组,则它们将无法有效地处理键。通常一个键有合理的大小(我猜最多一百个字节)。

标签: c++ data-structures tree b-tree


【解决方案1】:

使用散列。散列是键的固定大小表示。有关良好的散列函数,请参阅http://www.cse.yorku.ca/~oz/hash.html

【讨论】:

  • 嗯?我无法在树上保存哈希值.. 如果两个键哈希到相同的值怎么办?如何在树上找到它们?
  • @l19:当然可以。您只需要添加指向键值对的指针,该键值对本身具有指向下一个(链表)的指针。搜索特定键时,在树中找到其哈希值,然后沿着链移动比较键。
  • 此时,你还不如只使用哈希表,无论如何它都比 B+ 树快。使用 B+ 树的主要原因是您需要能够提取键的两个值之间的条目(子范围查询),甚至按顺序列出所有条目。
【解决方案2】:

简单的解决方案是将键存储为指针(包装在覆盖相关运算符等的类型中)而不是值,但这当然会损害作为使用 B+ 树的一部分的局部性。

也就是说,项目越大,项目在内存中的相邻性就越不重要。一个缓存页面甚至无法容纳一个巨大的项目,更不用说同一页面中的多个项目了。

另一种相对简单的方法是使用联合类型或放置 new 或其他任何方式在内存换项目类型中分配项目,该类型足以容纳您可能使用的所有项目类型。每个项目仍有固定数量的字节,但项目不一定使用所有这些字节。

如果您愿意做这项工作,您可以拥有可变大小的节点。当然,您在使用这些节点时会遇到一些麻烦,这取决于您如何安排节点内数据结构来应对这些问题。您可能在节点内有一个小项目指针数组,例如,指向也在节点内的项目(未在堆上单独分配)。

此外,每次更改节点时,都可能需要重新分配它。即使您所做的只是重新平衡,这可能会将一个巨大的项目从一个节点移动到另一个节点,并且即使目标节点有空间,即为项目提供一个空闲插槽,它也可能没有足够的字节来存储价值。

从某种意义上说,每个节点都是一个迷你堆,您可以在其中为大小项目分配或释放空间,但有时您必须返回正确的堆以将迷你堆替换为更大或更小。

再次值得一提的是,如果项目如此庞大,那么节点内的位置可能无论如何都无关紧要。

我之前在内存中实现了 B+ 风格的多路树,但我从来没有走到这个极端。

【讨论】:

    【解决方案3】:

    您可以将大键的其余部分保留在溢出页面中,例如 there

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 2014-04-08
      • 2016-11-09
      • 2012-12-19
      相关资源
      最近更新 更多