From b01efa7aa23f95363aa4797b826305701a8b97f5 Mon Sep 17 00:00:00 2001 From: Shine wOng <1551885@tongji.edu.cn> Date: Tue, 18 Jun 2019 20:41:26 +0800 Subject: [PATCH] fix some errors in . --- thu_dsa/chp8/B-tree.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/thu_dsa/chp8/B-tree.md b/thu_dsa/chp8/B-tree.md index 16213d1..1352a56 100644 --- a/thu_dsa/chp8/B-tree.md +++ b/thu_dsa/chp8/B-tree.md @@ -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树定义中根结点的分支数不必遵守下限的原因。