Java B-树实现
我正在阅读Rober Sedgewik的关于实现B-Tree的文章,并在Java B-树实现,java,algorithm,data-structures,tree,b-tree,Java,Algorithm,Data Structures,Tree,B Tree,我正在阅读Rober Sedgewik的关于实现B-Tree的文章,并在search方法的else部分从以下链接中找到了这个片段: //内部节点 否则{ 对于(int j=0;j
search
方法的else
部分从以下链接中找到了这个片段:
//内部节点
否则{
对于(int j=0;j
我撞到了头,但不明白为什么他直接开始比较key
和j+1
th元素children
而不是j
th元素。
有人能解释一下这一点吗?如果你看看他对
less()
方法的声明,你会注意到它使用了compareTo
本质上,他想做的是key.compareTo(children[j+1].key)
但他为什么要用j+1
而不是j
?要理解这一点,请看他的条件陈述的第一部分;他使用j+1==x.m
,这意味着他想测试j+1是否是极限。如果j+1=x.m
,他不想继续递增j,因此返回。但是,如果尚未达到限制,请选中“将当前密钥与列表中的下一个密钥进行比较”(因为下一个密钥存在)。如果列表中的下一个键比当前键“小”,请搜索当前键
简言之:
如果
j+1
不存在,If语句的前半部分将捕获它,它将跳出for
循环。否则,请检查j+1的键。好的,我找到了。但这样做,难道他根本就没有将key与j
th元素进行比较吗?我想知道如果j
th元素本身的key
大于key
,会怎么样?他甚至不应该去j+1,对吧?我不认为他想和j比较。如果您阅读搜索函数的其余部分,它是一个If-else语句,这使我假设j的比较是在“If语句”中完成的。“else”部分(您发布的部分)只是为了确保他不会得到NPE(如果没有下一个值)。实际上,if
条件用于叶节点(if(ht==0)
)和else
用于内部节点。另外,请注意,在if
块中,他从j=0
进行检查;它是一棵树,因此它是由较小的树组成的。这个函数是一个递归函数,所以他需要检查以确保内部函数不为null,然后在子函数上调用search(它本身会检查j,而不是j+1),实际上,最终找到了它!这是因为在B-树中,除了叶节点之外,没有任何节点携带任何信息。它们只是作为分隔物。因此,该分隔符将是子条目中的第一个子条目。所以,它不需要搜索!
// internal node
else {
for (int j = 0; j < x.m; j++) {
if (j+1 == x.m || less(key, children[j+1].key))
return search(children[j].next, key, ht-1);
}
}