关于C#:B具有可变长度键的树

B+ tree with variable length keys

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

如果我希望树接受可变长度的键,我应该修改什么?如果我说节点必须至少有2个密钥,但是我要插入的密钥太大而无法容纳该节点的块,该怎么办?


简单的解决方案是将键存储为指针(package为重写相对运算符等的类型)而不是值,但是这当然会损坏局部性,这是使用B树的关键所在。

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

另一种相对简单的方法是使用联合类型或新的放置方式,或使用其他方式在用于项目的内存类型中分配项目,该类型对于您可能使用的所有项目类型都足够大。每个项目仍然具有固定数量的字节,但是这些项目不一定使用所有这些字节。

如果您愿意做这项工作,则可以有可变大小的节点。当然,根据如何安排节点内数据结构来处理这些节点,您会遇到一些麻烦。例如,您可能在节点内有一小列的项目指针,它们指向也位于节点内的项目(未在堆上单独分配)。

此外,每次更改节点时,可能都需要重新分配它。即使您正在做的只是重新平衡,也可能将一个大型项目从一个节点移到另一个节点,即使目标节点在为项目腾出空闲空间的意义上有空间,也可能没有足够的字节来存储节点。值。

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

再次值得一提的是,如果项目如此之大,则节点内的位置可能根本就不相关。

我在自己之前已经在内存中实现了B风格的多路树,但是我从未达到过这种极端。


您可以将大键的其余部分保留在溢出页面中,就像在那儿一样。


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