在B +树的常见实现中,我们可以假设密钥具有固定长度(例如,25个字节)。然后我们可以定义每个节点必须具有最小数量的密钥和最大数量。
如果我希望树接受可变长度键,我应该修改什么?如果我说节点必须至少有2个密钥,但是我试图插入的密钥是如此之大以至于它不适合保存节点的块,该怎么办?
答案 0 :(得分:2)
简单的解决方案是将键存储为指针(包含在覆盖相对运算符等的类型中)而不是值,但这当然会损坏作为使用B +树的一部分的局部性。
也就是说,项目越大,项目在内存中相邻的越少。巨大的项目甚至不适合缓存页面,更不用说同一页面中的几个。
另一种相对简单的方法是使用联合类型或放置new或者其他任何东西来分配项目内存类型中的项目,这些项目对于您可能使用的所有项目类型都足够大。每个项目仍然有固定的字节数,但这些项目不一定使用所有这些字节。
如果你愿意做这项工作,你可以拥有可变大小的节点。当然,您可能会遇到一些麻烦,这取决于您如何安排节点内数据结构以应对这些节点。例如,您可能在节点中有一小组项目指针,指向也在节点内的项目(未在堆上单独分配)。
此外,每次更改节点时,您可能需要重新分配它。即使你正在做的只是重新平衡,这可能会将一个巨大的项目从一个节点移动到另一个节点,即使目标节点在某个项目中有一个空闲区域的意义上也可能没有足够的字节来存储值。
从某种意义上说,每个节点都是一个小型堆,您可以在其中为大小的项目分配或释放空间,但有时您必须返回到适当的堆来替换该小型堆。更大或更小。
再次值得一提的是,如果项目非常庞大,那么节点内的位置可能无关紧要。
我之前在内存中实现了B +风格的多路树,但我从来没有走到这个极端。
答案 1 :(得分:1)
您可以将大键的其余部分保留在溢出页面中,例如there。
答案 2 :(得分:0)
使用散列。哈希是密钥的固定大小表示。有关良好的散列函数,请参阅http://www.cse.yorku.ca/~oz/hash.html。