您的位置:首页 > 其它

B-tree浅析

2014-04-18 21:53 120 查看
今天去面试实习,问道B-tree,没有答出来,在此记录。

B-tree和二叉查找树类似,也是一种动态平衡的搜索结构。他和二叉查找树最显著的差别就是结点的孩子数的上界并不限定为2。一种数据结构的提出往往是基于一定的应用背景,B-tree最广泛的应用是外存的数据组织形式(如硬盘,数据库系统等)。在冯诺依曼体系中,数据存放在外存,当要对数据进行处理时,先要在外存中找到对应的数据块,这个寻找的过程实际上需要每次将考察的数据块调入内存,然后才能计算这块数据是否是我们要找的,如果不是则接着调用外存中的下一个数据块,如果是就对这块数据进行处理,处理完后,再输出到外存(这里是不是说明输入操作次数要多于输出操作的次数呢???)。然而外存与内存之间IO操作是相当耗时的,为了降低频繁IO的开销,需要对外存的数据进行精心的组织,B-tree很好的解决了这个问题。因为B-tree的结点可以有很多关键字,B-tree的高度和和结点总数相比二叉树大大缩小,每次向内存调入数据时,将B-tree中整个结点记录的数据块一次性全部调入(硬盘在设计时,同一个柱面上的数据应尽量组织在B-tree的一个结点中)。

B-tree的定义如下:

1、每个结点包含以下几个属性:该结点中关键字的个数n;n个关键字;标记该结点是否为叶子结点的一个flag;如果该节点不是叶子结点,还应包含n+1个指向其孩子结点的指针;

2、每个叶子结点具有相同的高度,即树高h;

3、树有一个属性称为度,记为t(t>=2),度给出了树中结点的关键字个数的上下界:下界——除了根节点以外的每个结点必须至少有t-1个关键字,因此除根节点以外(根节点至少有一个关键字,即至少有两个孩子结点)的每个非叶子结点至少有t个孩子结点,上界——每个结点至多有2t-1个关键字,因此一个非叶子结点最多有2t个孩子结点。

关于B-tree的高度h有以下结论(N为B树中所有关键字的总个数):h<=log t ( (N+1)/2 ) (t为对数的底)。这个结论的意义在于它给出了树高的上界,这个上界是在每个结点都取最小的关键字个数(即t-1个)的情况下得到的。由于在一棵树中检查一个数据块是否是我们当前要处理的数据块都需要将其调入内存,相比***L树和红黑树,B-tree大大降低了树的高度,从而大大降低了将数据块调入内存的次数。

B-tree的三种基本操作:

1、查找关键字:和二叉查找树类似,只不过在选择孩子节点进行递归查找的时候,需要依次遍历该节点的关键字(当然,如果树的规模很大,结点中包含的关键字很多,可以二分);

2、插入关键字:新的关键字每次插入的位置肯定是某个叶子结点(也就是说新关键字刚加入B-tree的时候肯定是在最底层的),由于结点的关键字个数有上界2t-1,在插入新关键字后可能导致所在的孩子结点分裂,而这种分裂可能会沿着搜索该叶子结点的路径向根节点传播,所有插入新的关键字可能会使得B-tree的高度+1。既然这种分裂可能向上传播,实际在维护一棵B-tree时并不是等到要被迫分裂满结点时才分裂,而是在沿着树往下查找新的关键字所属叶子结点时,就分裂沿途遇到的每个满结点(无论这个满结点最终是否会真的被迫分裂)。

3、删除关键字:与插入关键字对应,删除关键字可能使得B-tree的高度-1,因为删除关键字,可能使得某些结点的关键字个数少于t-1,从而导致了一些结点的合并。

最后,B-tree是在1972年由Bayer和McCreight提出的,在感叹自己无知的同时,向大师致敬!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: