Java B-树实现

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

我正在阅读Rober Sedgewik的关于实现B-Tree的文章,并在
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);
            }
        }