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)的时间内完成。
}