我在书 CLRS 上读到我们有m-way B-tree,其中m是偶数。但是有没有B-Tree,其中m是奇数,如果有,那么我们如何才能对本书中给出的代码进行更改。
答案 0 :(得分:0)
通过m-way B-tree我假设你的意思是一个B树,每个内部节点最多允许有m个孩子。根据CLRS对B树的定义:
节点具有可包含的键数的下限和上限。我们用固定整数t≥2表示这些界限,称为B树的最小程度:......内部节点可能最多2t个孩子。
所以孩子的最大数量总是甚至 - 按照这个定义,它不可能是奇怪的。
但是,这不是B树的唯一定义。有许多定义略有不同,最终对整体性能几乎没有影响。这可能会引起混淆。有一些B树定义允许奇数上限和不允许奇数上限。 CLRS的定义对于内部节点的子计数没有奇数上限。
然而,B树的另一个正式定义是Knuth [1998](计算机编程艺术,第3卷(第二版),Addison-Wesley,ISBN 0-201-89685-0 )。 Knuth的定义 允许奇数上限。当CLRS枚举t≥2时形式(t,2t)的所有最小 - 最大树界限时,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
。这两个结果节点中的一个将具有比另一个更多的键。如果您正在寻找代码,我建议您在互联网上查找使用类似于Knuth的定义的B树的实现(例如,搜索" Knuth Order B -tree"。)