【发布时间】:2017-03-09 21:07:57
【问题描述】:
我在 CLRS 一书中读到,我们有 m 路 B-tree,其中 m 是偶数。但是是否存在 m 为奇数的 B-Tree,如果存在,那么我们如何对本书中给出的代码进行更改。
【问题讨论】:
-
偶数m会有什么问题?您尝试了哪些更改,您是否遇到了问题? (有人会相信 2-3-trees 和 2-4-trees吗?)
我在 CLRS 一书中读到,我们有 m 路 B-tree,其中 m 是偶数。但是是否存在 m 为奇数的 B-Tree,如果存在,那么我们如何对本书中给出的代码进行更改。
【问题讨论】:
通过 m 路 B 树,我假设您的意思是 B 树,其中每个内部节点最多允许有 m 个子节点。根据CLRS对B-tree的定义:
节点对它们可以包含的键的数量有下限和上限。我们用一个固定整数 t} ≥ 2 表示这些界限,称为 B 树的最小度数:...一个内部节点可能有最多 2t 个子节点。
所以孩子的最大数量总是偶数——根据这个定义,它不可能是奇数。
然而,这并不是 B-tree 的唯一定义。有许多定义略有不同,最终对整体性能几乎没有影响。这可能会导致混乱。有一些 B 树定义允许奇数上限,而那些不允许。 CLRS 的定义没有奇数上限用于内部节点的子节点数。
但是,B 树的另一个正式定义是 Knuth [1998](计算机编程艺术,第 3 卷(第二版),Addison-Wesley,ISBN 0-201-89685-0)。 Knuth 的定义确实允许奇数上限。当 CLRS 枚举所有形式为 (t, 2t) 的最小-最大树边界时 t ≥ 2 时,Knuth 枚举所有形式为 (ceil(k/2), k) 的树边界时 k ≥ 2。
Knuth Order, k | (min,max) | CLRS Degree, t
---------------|-------------|---------------
0 | - | –
1 | – | –
2 | – | –
3 | (2,3) | –
4 | (2,4) | t = 2
5 | (3,5) | –
6 | (3,6) | t = 3
7 | (4,7) | –
8 | (4,8) | t = 4
9 | (5,9) | –
10 | (5,10) | t = 5
例如,2-3 tree, (2,3) 是 Knuth 阶为 3 的 B 树。但它不是有效的 CLRS 树,因为它的上限是奇数。
更改代码并不容易,因为 B 树有很多代码取决于变量 t。最大的变化之一是内部:B-TREE-SPLIT-CHILD(x,i),您需要找到一种方法将一个孩子与奇数个孩子(一个偶数键)到节点y 和z。这两个结果节点之一将比另一个多一个密钥。如果您正在寻找代码,我建议您在 Internet 上查找 B-tree 的实现,该实现使用类似于 Knuth 的定义(例如搜索“Knuth Order B-tree”)。
【讨论】: