B-Tree - 为啥没有偶数个键的节点?

Posted

技术标签:

【中文标题】B-Tree - 为啥没有偶数个键的节点?【英文标题】:B-Tree - Why can't there be a node with an even number of keys?B-Tree - 为什么没有偶数个键的节点? 【发布时间】:2011-03-31 19:47:53 【问题描述】:

我正在尝试根据“算法简介”中的“B-Trees”一章来实现 B-Tree。

我不太明白的是“最低学位”。在书中指出 degree 是一个 数字,表示节点可以持有的键数的下限/上限。它进一步说:

    每个非根节点都至少存储t - 1 键并拥有t 子节点每个节点最多存储2*t - 1 键,并有2*t 子节点

所以你得到 t = 2:

    t - 1 = 1 个键和 t = 2 个孩子 2*t - 1 = 3 把钥匙和 4 个孩子

对于 t = 3

    t - 1 = 2 个键和 t = 3 个孩子 2*t - 1 = 5 把钥匙和 6 个孩子

现在问题来了:B-Tree 中的节点似乎只能在已满时存储 odd 个键。

为什么不能有一个节点,比如说最多 4 个键和 5 个子节点?它与拆分节点有关吗?

【问题讨论】:

in "Introduction to Algorithms" - 你瞧! 哪个“算法简介”:作者?出版商?语言?国际标准书号?超链接? 【参考方案1】:

好像B-Tree中的节点只能存储奇数个key?

绝对不是。您写的数字分别是最小和最大键数,因此对于t = 2,允许具有 1、2、3 个键的节点。对于t = 3,允许具有 2、3、4、5 个键的节点。

此外,树的根只允许有 1 个键。

可以定义(和实现)具有例如的树。一个节点中有 1 或 2 个键(所谓的 2-3 树)。 B树被定义为容纳更多的原因是,这会导致更快的性能。特别是,这允许摊销O(1)(计算拆分和连接操作)删除和插入操作。

【讨论】:

当然你是对的......我的意思是当节点已满时 - 它只能包含奇数个节点。我仍然不明白为什么这会带来更好的性能,请参阅 ire_and-curses 评论。 @Helper Method:好的,我认为第二段回答了你的问题——你需要正式的证明吗? @jpalecek 我已经编辑了原始问题,但 OP 实际上询问了节点何时已满:为什么完整节点不能没有偶数个键?那是 OP 的实际不太明确的问题,IMO。【参考方案2】:

这不是不可能的,而是次优的。如何拆分具有奇数个子节点的节点?

【讨论】:

我不明白这个论点。您将中间子节点移到父节点中,然后将中间节点右侧的所有子节点分配给父节点的新子节点。

以上是关于B-Tree - 为啥没有偶数个键的节点?的主要内容,如果未能解决你的问题,请参考以下文章

JMenuCheckBox:如何设置只有 1 个键的加速器

索引背后的数据结构(B-/+Tree)

将 csv 导入为具有 2 个键的哈希表

带有几个键的 QT3D QML RenderPassFilter 似乎有问题

innodb 存储引擎为啥要用一个自增的主键

将pandas数据帧转换为具有多个键的字典