B-树

 m 阶B树的,满足如下条件的m路平衡的查找树的;其中的每一个内部结点的

都存有N个股那件澳门{k1,k2..kn} 和n+1 的引用,{A0,a1,,a2,,,,an},对于没一根的界定的

都有的n+1 》[m/2];对于跟接单的,除非他是同事叶子的,否则必有n+1>=2;

   每个引用ai分别指向的一颗字数的,而且若i>=1,则ti 中的每一个关键码的都满足

若i《n-1的则其中的ti 的每一个关键码的的都满足的key<ki+1余一般的茶轴书的,为了简化的

我们家丁B树中的所有关键的吗是相互的。

  另外的,所有的叶子节点的深度的相等个,即他们都处于同一层。

 

7.4.3  关键码的查找的  

  在一颗的B-树中针对的关键码 的key的查找过程与文芬查找类似: 从根节点出发了通过

关键码的比较,不断深 入下一层,知道的某一个管家那么的命中,或者的到达某一个叶子节点

查找失败,但B-树的查找过程的与二分查找也旅游区别。由于ii每个节点同城都存放这了多个股那件am

所以可能是多次比较,才能确定应该是的下一层 的哪一个节点继续神粗查找,这一个过程具体的描述

算法7:

算法: find(v,key)

输入: b-树节点,关键码的key

输出: 若关键码的key在v 为根结点的B-树的内存在则法牛管家那么的位置,斗则

返回Null

 {

  若 v 是叶子,则返回null.

 在 v 中顺序的查号关键码的key;

若找到关键码key,则,返回位置。

否则: //设key 结余v 中两个响铃的管家那么的之间,即ki<key<ki+1;

 调用的find(&ai,key);

 

 

7.4.4 性能分析

正如的此前的指出的,B+树的最合适雨大给你发规模的数据,由于这里的数据的好

规模之大,只能讲其中的一笑部分放在内存中,实际的做法是,将每个这样的

数据集合组织成一个一颗B-树,并皴法与外村的lB-树,的根节点的常住备注,一旦

需要查找,则按照算法,首先将根结蒂娜当做当前节点,并在,随后,该节点该解读读入内存,作为新的档期那节点,并做一次上述查找,。。。这种过程不断的重复,知道的在档期那的节点中找到木桥关键码或者档期那的

叶子变成叶子。

由此可见,在B树中查找所需要的时间,不如爱护的小号量大类,将某个节点中外村中读入内存,以及对

内存中节点进行找找,争取此前教导大,监狱内存,外村的放在访问去打差异,前一个时间及是

是必然的,后一个时间ide则可以护绿额。

因此的B树查找到效率是主要取决于外村的次数,那么对B 树的每次找谁需要的进行多少小的外村的督促呢。?

首先的育儿分发的,列斯的,子对B树中的每一次的查找过程中,在每一层知道只有一个节点的被访问

访问到,由此可知i,meici查找没需索的外村的访问,之多的不超过O(n),其中的h为树高度。

那么树高 是多少呢? 最大多少呢? 最小是多少呢?

证明:

  若存在N个关键字的m阶的m接的B-树的h ,则logm(N+1)<h<log(N=1/2)+1;

 首先证明:

在关键码总数一定的前提下,为使 B-树最高,每个内部节点都应该包含尽可能少的
关键码。按照 B-树的定义,各层节点数至少是:

n0=1;

n1=2;

n2=2*[m/2];

n3=2*[m/2]2

...

nh-1=2*[m/2]h-2

mh=2*[m/2]h-1 

先考察叶子的所在层,叶子的数目应该恰好比管家吗的总数1,固有

n+1 =# 叶子节点 》=2*(m/2)h-1,h>1;

先考察的叶子界节点的,叶子的数组应该是恰好的比挂机啊哈的多1,固有:

N+1=#   叶子节点的 》= 2 *[m/2]h-1,h>=1;

即: h<=logm/2(N+1) +1 =Olog(M/2) 

 

在证明: h>=logm(N+1) 方法

在关键管的总数的一定的前提下为B树最矮,每个内部节点都应该包含尽可能多的关键码

,按照的B树的定义,各层节点数的至多是L

n0=1;

n1=m;

n2=m2;

 

考察的叶子的节点与1 的通理由:

n+1 =# 叶子节点 《=logN

引入定理:  存有N个关键字的m接B输的高度 h=log(mN).

 因此,每次查找的之多的粗腰访问O(logmN);

因此,每次查之多需要经过访问不(lognN)的芥蒂娜,即使需要做O(log2n)外村的

读取。因此,若假设外村的都需要常数的时间,则如如下结论:

定理7:  对存有N个关键字的M街B树的每次查找操作,都可以在O(logmN)的时间内完成。

 

 

7.4.5 上一节点的处理:

对存有N个关键字的mjie B 树的叉叉操作,都尅在O(logmN )时间内完成。

在一下7.4.6 肩高介绍的关键码中,需要处理一种非法的情况,

⎧ u 1 = {k 1 ,…,k ⎣m/2⎦ }
u 2 = {k ⎣m/2⎦+2 ,…,k m 

观察结论L 在处理的没有给上衣得而定账号后,父亲节点中的关键码必然会增加一个,

 

7.4.6  关键码的插入

为了在B 树中插入一个新的关键码key,首先在调用的通过find(v,key)进行操作,唐诺

查找陈功,则考虑到B树中的管剑麻各个互译的条件,将不再插入重读的古耐庵am的 

插入操作弯成。否则,茶渣过程必然终止于某个叶子节点街。

在这个查找过程中哦,将最后一个呗访问到的叶子节点,基座u.

   我们直接将关键码的key 插入到u 中若磁偶芥蒂娜中滚剑麻数据Iran可发,则插入操作也可立即结束。 斗则

按照7.4.5 介绍的方法,对节点U 进行分裂。

算法:  insert(u,key)

输入:  B树节点的u ,关键码的key

输出: 将关键码key 插入到节点中U中,因此u移除,则将u 一分为2,并

返回剧中的关键码。

{

  将关键码的key插入到节点u 中。

  if(u 中的关键码额数目》=m){  //因为的新的关键码引入知道节点u移除,

//其中的关键码的慰藉,将节点弗恩列为三部分:

  u=u1 u{k/m+1}Uu2;

= {k1, …, k⎣m/2⎦} ∪ {k⎣m/2⎦+1} ∪ {k⎣m/2⎦+2, …, km};

}

 

 令P  为 u的父亲芥蒂娜;若P不存在,则创建一个空节点:P

insertkey(p,k[m/2]+1); //递归的将关键码的k[m/2] 插入的P中

在节点P中将关键码的中,将关键码两侧的字数引用粉笔诶指向u1和u2;

}

 

算法:  insert(v.key)

输入:B-树阶段v,关键码key.

 

算法:insert(v,key);

输入: B树节点 v,关键为keyl

输出: 将关键码key 插入到v为根节点的b 树中。

     

if(find(v,key)){

    return;

//令u为查找过程中访问过的最后一个节点:

insertKey(u,key);

}

 

 

7.4.7  下移接地啊你的处理

观察结论七:  在处理好的一个下一处节点后,其父亲节点中的关键码的不会增加,但有可能增加。

但有可能会减少一个。

 

7.4.8     关键码的删除

 为了 从B树中删除一个关键码key,也需要调用,

 

通过对话,总能保证节点U处于内部结点的最底层,现在我们直接将key从

u 中删除,若此后节点U中关键码的数据依然合法,则删除曹禺理解结束。

算法: remove(v,key)

输入: B树节点,关键码key

输出:  若关键码在为v为个界定的B树内存,则将其删除,并这书的重新吊证为合法的

B树。

 

    if(null ==find(v,key)){

return;

}  

令u 为key所在的内部节点,并讲求这棵树的重新吊证为合法的B-shu树

     if(null==find(v,key)){

 return;

}

 

令 u为key的所在的内部节点,若u 不是出于最底层,则将key 与他的字节前驱挂念am

交换,保证u 出于最底层。

 

从  

 

定理10 : 对存有的N个关键字的m阶B树的每次的删除操作,都可以在

               O(logmN)的时间内完成。

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执于代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值