【问题标题】:Using binary search in B-Tree在 B-Tree 中使用二分查找
【发布时间】:2018-06-12 00:51:52
【问题描述】:

在CLRS(Introduction to algorithm)一书中,第18章介绍了B-Tree。它具有以下性质(P488)

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

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

为什么要这样做?用二分查找会不会有更好的表现?

【问题讨论】:

  • 我不知道来源,但我猜你从根到树叶“线性”搜索,根据节点的值向左或向右分支。实际上,考虑到树的结构,这当然是二分查找。
  • 我编辑了这篇文章。 “线性”是指在特定节点中搜索。您可以参考 CLRS 伪代码以获得更好的理解。
  • 嗯,没有源码我是无法参考伪代码的。但我了解您的意思不是搜索节点,而是搜索节点 within 的键。据我了解,每个节点都有固定(少量)的值,因此在此处使用二分搜索可能有点矫枉过正,或者作者遗漏了实现细节。
  • 他们可能只是想保持简单。如果扇出足够大,实际实现在节点中使用二进制搜索。

标签: algorithm


【解决方案1】:

如果您想允许顺序变化,那么您是对的:进行二分搜索仍会导致时间复杂度为O(log n),而进行线性搜索会导致时间复杂度为O(t log n)。但是,如果您认为 B-tree 的顺序(最大程度)是固定的,那么您是进行二进制搜索还是线性搜索与时间复杂度无关。由于顺序通常由缓存行大小等因素决定,因此可以进行合理的简化。

在实践中,线性搜索通常会给您带来更好的性能,因为它可以用更少的分支完成并且更适合 SIMD 处理。实际的 B-tree 实现要么只使用线性搜索,要么使用初始二叉搜索,然后进行线性搜索。搜索所花费的挂钟时间将主要由等待获取节点的时间所支配,而不是由搜索适当的子节点所支配。

【讨论】:

  • 我们应该如何在python的B树节点中进行这种二分搜索? @Sneftel
猜你喜欢
  • 2013-11-10
  • 2017-03-02
  • 2011-04-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
相关资源
最近更新 更多