fix some errors in <B-tree.md>.

This commit is contained in:
Shine wOng
2019-06-18 20:41:26 +08:00
parent 587aa24985
commit b01efa7aa2

View File

@@ -15,7 +15,7 @@ B树其实是由二叉搜索树变化而来它的本质仍然是二叉搜索
既然B树是由BST的结点合并重组而来其本质上和BST完全等效那么B树存在的意义是什么
这里就需要考虑多级存储系统了。考虑某个大型数据文件在某低级存储介质上如硬盘以二叉平衡树AVL的形式组织。假如该文件的大小为1G即$2^30$。这样每次查找至多需要30次I/O操作。我们知道不同存储介质之间的访问速度差异往往是巨大的例如内存的访问速度大约是硬盘的$10^5$倍尽管最坏情况下也只需要30次访问但是这样30次硬盘访问操作的代价其实是非常巨大的。
这里就需要考虑多级存储系统了。考虑某个大型数据文件在某低级存储介质上如硬盘以二叉平衡树AVL的形式组织。假如该文件的大小为1G即$2^{30}$。这样每次查找至多需要30次I/O操作。我们知道不同存储介质之间的访问速度差异往往是巨大的例如内存的访问速度大约是硬盘的$10^5$倍尽管最坏情况下也只需要30次访问但是这样30次硬盘访问操作的代价其实是非常巨大的。
而如果采用B树的话我们已经注意到树的整体高度会显著降低。此时的问题是每次需要从外存中读入一个超级结点它可能包含了许许多多先前的普通结点对这样超级结点的I/O操作需要花费的时间又如何呢
@@ -39,11 +39,11 @@ N + 1 = n_h \ge 2[m/2]^h
$$
所以
$$
h \le log_{[m\2]}^{\frac{N+1}{2}} = O(log_m^N)
h \le log_{[m/2]}^{\frac{N+1}{2}} = O(log_m^N)
$$
可以看到与普通的BBST相比B树的最大高度要降低了$log_2^m$倍若取m = 256树高(I/O次数)约降低至1/7。
同理的方法可以分析B树的最小高度即$n_0 = m - 1, n_1 = (m-1)^2, n_k = (m-1)^(k+1)$,所以对于所有的外部结点有
同理的方法可以分析B树的最小高度即$n_0 = m - 1, n_1 = (m-1)^2, n_k = (m-1)^{k+1}$,所以对于所有的外部结点有
$$
N + 1 = n_h \le (m-1)^{h+1}
$$
@@ -75,7 +75,7 @@ B树查找操作的内涵和前面的BST以及AVL是完全一致的只是在
发生上溢的结点必然具有m个关键码分裂后的左右两个超级结点分别都具有$\frac{m-1}{2}$个关键码。设m为奇数则左右结点的关键码数量相同都等于$\frac{m-1}{2}$,此时每个结点所含的最少的关键码数量为$\left \lceil m/2 \right \rceil - 1= \frac{m-1}{2}$,刚好可以满足条件。
若m为偶数设左结点的关键码数为$\frac{m}{2}$,那么右结点的关键码数$\frac{m}{2} - 1$,此时每个结点所含的最少关键码数为$m / 2 - 1$,同样是满足要求的。故得证。
若m为偶数设左结点的关键码数为$\frac{m}{2}$,那么右结点的关键码数$\frac{m}{2} - 1$,此时每个结点所含的最少关键码数为$\frac{m}{2} - 1$,同样是满足要求的。故得证。
需要注意的是上溢调整后相当于原上溢结点的父结点也被插入了一个新的结点因此该结点也可能因此产生上溢异常。通过这种方式上溢可能会持续发生并且不断地向上传播直到传播至根结点。此时应该将原根结点分裂并且将中间结点提升为新的根结点这也是B树高度增加的唯一方式。需要注意的是此时根结点只具有两个分支这也是B树定义中根结点的分支数不必遵守下限的原因。