具有可变长度键的B+树

B+ tree with variable length keys

本文关键字:      更新时间:2023-10-16

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

如果我想让树接受可变长度的键,我应该修改什么?如果我说节点必须至少有2个键,但我想插入的键太大了,无法放入保存节点的块中,那该怎么办?

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

也就是说,项越大,项在内存中相邻的关系就越小。巨大的条目甚至不适合一个缓存页面,更不用说在同一个页面中放置多个条目了。

另一种相对简单的方法是使用union类型或placement new或其他方法在一个足够大的内存for item类型中分配项目,该类型可以容纳所有可能使用的项目类型。每个项目仍然有固定的字节数,但是这些项目不一定使用所有的字节。

如果你愿意做这项工作,你可以有可变大小的节点。当然,处理这些节点会遇到一些麻烦,这取决于如何安排节点内数据结构来处理这些问题。例如,您可能在节点中有一个小的项指针数组,指向同样在节点内的项(而不是在堆上单独分配)。

而且,每次更改节点时都可能需要重新分配它。即使你所做的只是重新平衡,也可能会将一个巨大的项目从一个节点移动到另一个节点,即使目标节点有空间,也可能没有足够的字节来存储项目的值。

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

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

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

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

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

相关文章:
  • 没有找到相关文章