B-树和B+树

来源:互联网 发布:电子刊物制作软件 编辑:程序博客网 时间:2024/06/05 08:17

部分内容转自:http://jameswxx.iteye.com/blog/251173

在大型文件系统中,采用索引可以有效的提高查找的效率,建立文件时,在输入数据记录的同时,建立一张索引表,每个索引表项记录相应数据块的地址。检索文件记录时,先将外存上的索引表读入内存,从索引表中查到数据记录的地址后,再将相应的记录读入内存。如果文件中的数据在使用过程中记录变化较多,则要频繁地对索引表进行插入和删除操作,这时对索引表采用树型结构较好。但是如果文件系统很大,则索引表也往往很大,需分块读入内存,若采用二叉查找树的结构,仍需多次访问外存,而访问外存的代价很大,为了减少访问外存的次数,就应尽量减少索引表的深度。简要介绍一下广泛应用于大型文件系统中的B-树。
B-树是一种平衡的多路查找树,它在文件系统中很有用。
    定义:一棵m阶的B-树,或者为空树,或为满足下列特性的m叉树:
⑴树中每个结点至多有m棵子树;
⑵若根结点不是叶子结点,则至少有两棵子树;
⑶除根结点之外的所有非终端结点至少有ém/2ù 棵子树;
⑷所有的非终端结点中包含以下信息数据:(n,A0,K1,A1,K2,…,Kn,An)
其中:Ki(i=1,2,…,n)为关键码,且Ki<Ki+1,Ai为指向子树根结点的指针(i=0,1,…,n),且指针Ai-1所指子树中所有结点的关键码均小于Ki (i=1,2,…,n),An所指子树中所有结点的关
键码均大于Kn, ém/2ù -1≤n≤m -1 ,n为关键码的个数。

⑸所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。
如:(M=3)

【查找分析】
B-树的查找是由两个基本操作交叉进行的过程,即
   ⑴在B-树上找结点;    ⑵在结点中找关键码。
    由于,通常B-树是存储在外存上的,操作⑴就是通过指针在磁盘相对定位,将结点信息读入内存,之后,再对结点中的关键码有序表进行顺序查找或折半查找。因 为,在磁盘上读取结点信息比在内存中进行关键码查找耗时多,所以,在磁盘上读取结点信息的次数,即B-树的层次树是决定B-树查找效率的首要因素。

【插入】
    在B-树上插入关键码与在二叉排序树上插入结点不同,关键码的插入不是在叶结点上进行的,而是在最底层的某个非终端结点中添加一个关键码,若该结点上关键 码个数不超过m-1个,则可直接插入到该结点上;否则,该结点上关键码个数至少达到m个,因而使该结点的子树超过了m棵,这与B-树定义不符。所以要进行 调整,即结点的“分裂”。方法为:关键码加入结点后,将结点中的关键码分成三部分,使得前后两部分关键码个数个结点将其插入到父结点中。若插入父结点而使父结点中关键码个数超过m-1,则父结点继续分裂,直到插入某个父结点,其关键码个数小于m。可见,B-树是从底向上生长的。

【删除】
    分两种情况:

(1)删除最底层结点中关键码左兄弟 时,与右兄弟合并。由于两个结点合并后,父结点中相关项不能保持,把相关项也并入合并项。若此时父结点被破坏,则继续调整,直到根。如删去图9.16 (h)中7,得图9.18。

(2)删除为非底层结点中关键码
    若所删除关键码非底层结点中的Ki,则可以指针Ai所指子树中的最小关键码X替代Ki,然后,再删除关键码X,直到这个X在最底层结点上,即转为(1)的情形。
    删除程序。


B+树

       B+树是B-树的变体,也是一种多路搜索树:

       1.其定义基本与B-树同,除了:

       2.非叶子结点的子树指针与关键字个数相同;

       3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);

       5.为所有叶子结点增加一个链指针;

       6.所有关键字都在叶子结点出现;

       如:(M=3)

   B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

       B+的特性:

       1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

       2.不可能在非叶子结点命中;

       3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

       4.更适合文件索引系统;



原创粉丝点击