- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
?p=根结点; 栈S清空; // S存储结点的父结点 while p不是叶结点 { push(p,S);q=树中p结点子指针数;//父结点入栈 if (k?p-k1) p=p-p1 else 找i 满足p-ki-1k? p-ki ;p=p-pi ; 若p-kn?k 则 p=p-pn ; } i=Search(p, K); if(i0 i= m K= p-key[i]) 记录已存在;return; else 建索引项(k,d),数据指针d指向新记录; if 叶点*p 不满 insert(p,k,d) // 插到*p的正确位置 else //对满叶结点*p作分裂处理 { 把满叶结点*p的索引项复制到tmp; //准备分裂 把索引项(k,d)按序插入到tmp的正确位置; 建立一个空的新叶结点new; 用tmp的前ceil(m/2)个索引项覆盖结点*p的信息; 把tmp的其余索引项及相邻叶指针存入new; p-Pnext=new的地址 ; k*=新的最大关键字; Finish=false; //准备把(k*,new)插入父亲(内)结点 } While (!finish) { if 栈S空 { root=NewRoot(m,k*,new); //建立新空根结点 finish=true; } else *p=pop(S); //取出父结点 if 内结点*p不满 把(k*,new) 插入到*p;finish=true; else { 复制满内结点*p到tmp; 对满内结点*p分裂; } ?} B+树的删除也仅在叶子结点上进行,当叶子结点中的最大关键字被删除时,在非终端结点中修改成当前最大关键字值。若因删除使结点中关键字的个数少于?m/2?时,需要从兄弟结点中借一个关键字,如兄弟结点无法借出,则和其兄弟结点进行合并,过程同B-树。 80 99 61 80 99 B+树删除结点 24 45 88 99 3 24 37 45 45 99 a b c d e f g h 70 80 53 61 3阶B+树删除53 61 61 70 80 E1:查找算法到要删除关键字位置,删除该关键字。 E2:判断删除后关键字个数,如少于?m/2? 则进入E3,否则删除完成。 E3:找到其双亲结点(parent指针),判断其右兄弟关键字个数,如大于 ?m/2? ,则将其最小关键字取出(删除)插入该结点最右边,修改双亲结点中的最大关键字值。否则对其左兄弟做相同的处理。如均不满足则进入E4。 E4:其兄弟结点的关键字和该结点关键字合并,形成一新的结点。且将其双亲中相应关键字删除,如双亲结点删除一个关键字后满足E2要求则结束;否则重复E3。 E5:删除完成后判断是否平衡,不平衡则调整。 B+的特性: 所有关键字都出现在叶子结点的链表中,且链表中的关键字是有序的; 查找不可能在非叶子结点命中; 非叶子结点相当于是叶子结点的索引,叶子结点相当于是存储关键字数据的数据层; 适合于文件索引系统; 是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针; B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2); 50 96 15 50 62 78 96 71 78 84 89 96 56 62 20 26 50 3 8 15 sq root B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中; B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中; B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3; B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针; B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原
文档评论(0)