Algorithm 在B-树中使用二进制搜索

Algorithm 在B-树中使用二进制搜索,algorithm,Algorithm,在CLRS(算法简介)一书中,第18章介绍了B-树。并且它具有以下属性(P488) x.n键本身,x.key1,…,x.keyx.n以非减缩顺序存储 但在搜索B-树中的元素的过程中,将元素插入B-树中,CLRS使用线性搜索而不是二进制搜索来搜索特定节点中的键 为什么会这样?二进制搜索是否会获得更好的性能?如果您想允许顺序变化,那么您是对的:执行二进制搜索仍然会导致时间复杂度在O(logn)中,而执行线性搜索则会导致时间复杂度在O(tlogn)中。但是如果你考虑了B-树的顺序(最大度),那么你是否

在CLRS(算法简介)一书中,第18章介绍了B-树。并且它具有以下属性(P488)

x.n键本身,x.key1,…,x.keyx.n以非减缩顺序存储

但在搜索B-树中的元素的过程中,将元素插入B-树中,CLRS使用线性搜索而不是二进制搜索来搜索特定节点中的键


为什么会这样?二进制搜索是否会获得更好的性能?

如果您想允许顺序变化,那么您是对的:执行二进制搜索仍然会导致时间复杂度在
O(logn)
中,而执行线性搜索则会导致时间复杂度在
O(tlogn)
中。但是如果你考虑了B-树的顺序(最大度),那么你是否做了二进制或线性搜索并不重要的时间复杂度。由于顺序通常由缓存线大小等因素决定,因此这是一种合理的简化


实际上,线性搜索通常会给您带来更好的性能,因为它可以用更少的分支完成,并且更适合SIMD处理。实际的B-树实现要么只使用线性搜索,要么在线性搜索之后使用初始二进制搜索。搜索所用的挂钟时间主要取决于等待获取节点的时间,而不是搜索适当的子节点的时间。

我不知道源代码,但我猜您可以从树的根到叶“线性”搜索,根据节点的值向左或向右分支。实际上,考虑到树的结构,这当然是一个二进制搜索。“线性”指在特定节点中搜索。为了更好地理解,您可以参考CLRS伪代码。如果没有源代码,我就不能参考伪代码。但我明白,您不是指搜索节点,而是指搜索节点内的密钥。据我所知,每个节点都有固定(少量)的值,因此在这里使用二进制搜索可能有些过火,或者是作者遗漏了实现细节。他们可能只是想保持简单。如果扇出足够大,实际实现会在节点中使用二进制搜索@斯奈夫特尔