B树,又称作 m叉查找树
这样比如一个5阶的B树,除了根节点外
每个节点内元素个数最少有2个,最多有4个
一个6阶的B树,除了根节点外
每个节点内元素个数最少有2个,最多有5个
B树中非叶子节点的结构:
问题: 一个含有n个关键字的m阶B树,他的最大高度和最小高度是什么
计算高度时无特殊要求,叶子结点(即失败节点)那层是不计入高度的
思路:如果要求高度最小,那么在关键字个数一定的情况下,我们希望这个B树的每个节点能够尽可能地装满
每个节点最多有
m
−
1
m - 1
m−1个元素和
m
m
m个分叉
理想情况下:
第一层(只有根节点)元素个数为:
m
−
1
m-1
m−1
第二层元素个数为: m ∗ ( m − 1 ) m*(m-1) m∗(m−1) 即第一层有m个分叉指向第二层的m个节点,而第二层的m个节点最多有 m − 1 m - 1 m−1个元素, 所以第二层最多有 m ∗ ( m − 1 ) m * (m-1) m∗(m−1)个元素
第三层元素个数为:
m
∗
m
∗
(
m
−
1
)
m*m*(m-1)
m∗m∗(m−1)
… …
第h层的元素个数为:
1
∗
m
h
−
1
∗
(
m
−
1
)
1*m^{h-1} * (m-1)
1∗mh−1∗(m−1)
那么前h层的总个数是:
(m-1) * (1 + m +
m
2
m^2
m2 +
⋯
\cdots
⋯ +
m
h
−
1
m^{h-1}
mh−1) =
(
m
−
1
)
(m-1)
(m−1) *
m
h
−
1
m
−
1
\frac{m^h - 1}{m - 1}
m−1mh−1
即我们需要
(m-1) *
m
h
−
1
m
−
1
\frac{m^h - 1}{m - 1}
m−1mh−1
≥
\geq
≥
n
n
n
解得
h
h
h
≥
\geq
≥
l
o
g
m
(
n
+
1
)
log_m (n+1)
logm(n+1)
当求最大高度时,我们希望每一层的元素尽可能地少
第一层(只有根节点)最少元素数目为: 1个
第二层最少元素个数为: 1 * 2* (
⌈
\lceil
⌈m/2
⌉
\rceil
⌉-1) 个
… …
第h层最少元素个数为: 1 * 2 * (
⌈
\lceil
⌈m/2
⌉
\rceil
⌉)
h
−
2
^{h-2}
h−2 * (
⌈
\lceil
⌈m/2
⌉
\rceil
⌉ - 1)
可以推出,第h + 1层(即失败节点层)共有 1 * 2 * (
⌈
\lceil
⌈m/2
⌉
\rceil
⌉)
h
−
1
^{h-1}
h−1个节点
又因为,含有n个关键字的B树,必定有n+1个失败节点
所以
n
+
1
n+1
n+1
≥
\geq
≥ 1 * 2 * (
⌈
\lceil
⌈m/2
⌉
\rceil
⌉)
h
−
1
^{h-1}
h−1
解得
h
h
h
≤
\leq
≤
l
o
g
⌈
m
/
2
⌉
(
n
+
1
)
2
log_{\lceil m/2 \rceil }{\frac{(n+1)}{2}}
log⌈m/2⌉2(n+1)
+
+
+
1
1
1
↓
\downarrow
↓ 插入25
↓
\downarrow
↓ 插入38
↓
\downarrow
↓ 插入49
↓
\downarrow
↓ 插入60
↓
\downarrow
↓ 插入80
↓
\downarrow
↓ 插入90
↓
\downarrow
↓ 插入88,99
↓
\downarrow
↓ 插入70 83 87
↓
\downarrow
↓ 继续不停插入,直到变成这种形式