数据结构-详解B树

1.什么是b树?

B树是为磁盘或其他直接存取的辅助存储设备设计的一种多路平衡搜索树。B树类似于红黑树,但它在降低磁盘io次数方面要更好一点。B树和红黑树不同之处在于B树的节点可以有很多的子节点,从数个到数千个。也就是说,一个B树的分支因子可以相当大,尽管它通常依赖于所使用的磁盘单元的特性。b树类似于红黑树,就是每颗含有n个节点的B树的高度为O(lgn)然而,一颗b树的严格高度要比红黑树的高度要小很多,这是因为它的分支因子,也就是说表示高度的对数的底数可以非常大。

一个b树T树具有以下性质的有根树(T.root)

动态生成B树

 

1.每个节点都有以下的特性:

a.x.n,当前存储在节点x中的关键字个数。

b.x.n个关键字背身x.key1,x.key2,x.key1,........,x.keyn,以非降序的方式存放,使得x.key1<x.key2<.....<x.keyn。

c.x.leaf,一个布尔值,代表当前节点是否是叶子节点,如果是 则为true。

2.每个内部节点x还包含x.n+1个指向其孩子的指针x.c1,x.c2,x.c3,......,x.cn,,x.cn+1.叶节点没有孩子,所以他们的ci属性没有定义。

3.关键字x.key i(1,2,..,n)对存储在各子树中的关键字范围加以分割;如果k i 为任意的一个存储在x.c为根的子树的关键字,那么k1<=x.key1<=k2<=x.key2<=k3<=x.key3<=.....x.keyn<=keyn+1.

4.每个叶子节点具有相同的深度,及树的高度,所有的叶子节点都在同一层。

5.每个节点所包含的关键字个数有上界和下界。用一个被称为最小度数的固定整数t>=2来表示。

 a.除了根节点以外的每个节点必须包含至少有一个t-1个关键字。因此,除了根节点以外的每个内部节点至少有t个孩子,如果树非空,根节点至少有一个关键字。

b。除了根节点以外的每个节点之多包含2t-1个关键字,因此,一个内部节点至多可有2t个孩子。当一个节点恰好有2t-1个关键字的时候,称该节点是满的。

 

B树上的基本操作

1.搜索B树:搜索B树和搜索一颗二叉查找树很相似,只是在每个节点所做的不是二叉或者两路查找,而是根据节点的孩子做多路分支选择。

B-TREE-SEARCH是定义在二叉搜索树上的TREE-SEARH过程的一个直接推广。它的输入时一个指向某子树根节点x的指针,以及要在该子树中搜索的一个关键字k。因此,顶层调用的形式为B-TREE-SEARCH(T.root,k)。如果k在B树中,那么返回的是由节点和使得y.keyi==k的下标i组成的有序对;否则 返回NIL。

伪代码
i=1
while i<=x.n and k>x,keyi
      i+=1
if  i<=x.n and k==x.keyi
     return(x,i)
else if x.leaf
    return NIL
else DISK_READ(x,ci)
    return B-TREE-SEARCH(x.ci,k)

 

2.增加关键字

每次插入都是在叶子节点插入。

B树中插入一份关键字要比二叉搜索树中插入关键字复杂的多。像二叉搜索树一样,要查找插入关键字的叶节点的位置。然而在B树中,不能简单地创建一个新的叶节点,然后将其插入,因为这样得到的不是一个合法的二叉树。相反 我们将新的关键字插入一个已经存在的叶节点上。由于不能将一个关键字插图到一个满的叶节点上,至多有2t-1个关键字,故而引进一个操作,将满的节点按其中间关键字分裂成两个t-1关键字的节点,中间关键字提升到父节点中。

简单的B树插入9之前

                               

 

插入9之后

                          

中间的关键字8提升到父节点,7和9称为两个节点。

 

根节点的分裂,称为一个新节点的子节点,中间关键字提升到新节点中,分裂成两个节点,根节点的分裂是B树高度+1的唯一途径。

3.删除关键字。

删除关键字比较复杂(内存有点崩溃 不想写)

B树上的删除操作与插入操作类似,只是稍微复杂,因为可以从树中的任何节点删除,而不仅仅是叶子节点,而且当从一个内部节点删除一个关键字的时候,还需要重新安排这个节点的孩子。与插入操作一样,必须防止因为删除操作而导致B树的性质被破坏。必须保证删除一个关键字之后,节点的关键字个数大于t-1,如果删除一个关键字个数为t-1节点的关键字,就需要从其他节点移动一个关键字到这个节点。

a.从叶子节点删除关键字,直接删除。

删除关键字5后,直接在节点中删除

b.从内部节点中删除

 

1.如果节点x中前于k的子节点y中至少包含t个关键字,则找出k在以y为根节点的子树中前驱k1,删除k1,并在x中用k1代替k

删除关键字11,它的子节点为9和10组成的节点,找出子节点中最大值(10)就是k的前驱

删除11后。

2.对称的,如果y有少于t个关键字,则检查节点x中后于k的子节点z,如果至少有t个关键字,增找出k的后继,解释节点z的最小值。

针对上图 删除关键字10.  12代替10.

                          

3.如果y和z都只有t-1个关键字 则删除x中的k,y和z合并成有2t-1个关键字节点。

针对上图  删除关键字12.

                            

   动态生成B树 。

   动态生成B+tree

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值