1、什么是B树(B-树)?

B树是一种m阶树,m>=2

性质:

1)树中每个结点至多m个孩子;

2)对于根结点,子树个树取值范围为[2,m],关键字个数范围[1,m-1];

3)对于非根非叶结点,子树个数取值范围为[ceil(m/2),m],关键字个数范围为[ceil(m/2)-1,m-1];

4)所有叶子结点都出现在同一层。

5)每个非叶子结点中包含n个关键字信息:(n, P0, K1, P1, K2, P2, ... , Kn, Pn)。

n为关键字的个数,且有 [ceil(m/2)-1] <= n <= m-1

Ki为关键字,且按升序排序

Pi为指向子树的接点,且    K(i-1)  <=  P(i-1) 指向子树的所有结点关键字    <=Ki

三阶B树

2)3)的应用

如果B树结点的最小度数为固定整数t>=2,有

a) 非根结点至少 t-1个关键字,非根非叶结点至少t个子女

b)每个结点至多2t-1个关键字,每个非根非叶结点至多2t个子女

c)综上所述根结点关键字个数范围为:[1, 2*t-1],非根结点关键字个数范围为:[t-1,2*t-1]

2、B树复杂度与高度

B树的高度:

根为1个结点,第二层至少为2个结点,第三层至少为2t个结点,第四层至少2t*t个结点

将所有最小结点相加,推导过程:n>= 1+2+2t+2t^2+ ... +2t^(h-1)=3+2t (t^h-1)/(t-1)>=2t^(h-1)+1

最后推出的结果为

h<=log((n-1)/2)

3、操作

这里只给出插入删除操作,查找操作相对简单的多 这里不做解释

 1)B-树的插入操作(重点判断是否满足n<=m-1)

a.利用前述的B-树的查找算法查找关键字的插入位置。若找到,则说明该关键字已经存在,直接返回。否则查找操作必失败于某个最低层的非终端结点上。

b.判断该结点是否还有空位置。即判断该结点的关键字总数是否满足n<=m-1。若满足,则说明该结点还有空位置,直接把关键字k插入到该结点的合适位置上。若不满足,说明该结点己没有空位置,需要把结点分裂成两个。

分裂的方法是:生成一新结点。把原结点上的关键字和k按升序排序后,从中间位置把关键字(不包括中间位置的关键字)分成两部分。左部分所含关键字放在旧结点中,右部分所含关键字放在新结点中,中间位置的关键字连同新结点的存储位置插入到父结点中。如果父结点的关键字个数也超过(m-1),则要再分裂,再往上插。直至这个过程传到根结点为止。

2)B树的删除

a)利用B树查找算法找出关键字所在的结点,然后根据结点所在的位置判断是否为叶子结点

b)若为非叶结点,且被删关键字为该结点中第i个关键字key[i],则可从指针son[i]所指向的子树中找出最小关键字Y,代替key[i]的位置,然后在叶结点中删去Y,把非叶结点的删除化为叶结点的删除。

叶结点删除一个关键字的方法:

三种不同情况:

(1)如果被删关键字所在结点的原关键字个数n>ceil(m/2),则说明删去该关键字后该结点仍满足B树的定义,这种情况下直接删除即可;

(2)如果被删除关键字所在结点的关键字个数n等于ceil(m/2)-1,说明删去该关键字后该结点将不满足B树的定义,需要调整:

如果其左右兄弟结点中有“多余”的关键字,即与该结点相邻的左(右)兄弟结点中的关键字数目大于ceil(m/2)-1,则可将左(右)兄弟结点中最大(小)的结点上移至双亲结点,而将双亲结点中大(小)于该上移关键字的关键字下移至被删关键字所在结点中。

(3)如果左右兄弟结点中没有多余的关键字,即左右兄弟结点中关键字的数目均等于ceil(m/2)-1。

需要调整:

在删除关键字后,该结点中剩余的关键字加指针,加上双亲结点中的关键字(该关键字为结点与兄弟结点的分割者),合并到兄弟结点中去。

B树(B-树)的更多相关文章

  1. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  2. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  3. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  4. bzoj3262: 陌上花开(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  5. bzoj3295: [Cqoi2011]动态逆序对(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  6. BZOJ 3110 k大数查询 & 树套树

    题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...

  7. HDU 5877 dfs+ 线段树(或+树状树组)

    1.HDU 5877  Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...

  8. BZOJ 3110 树套树 && 永久化标记

    感觉树套树是个非常高深的数据结构.从来没写过 #include <iostream> #include <cstdio> #include <algorithm> ...

  9. 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

    涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...

  10. 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))

    函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...

随机推荐

  1. winServer2008下安装SqlServer2008数据库

    1 安装文件包 文件名 cn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso SHA1 0EEFF017B21635DF33F33C ...

  2. svn 常用控制台命令解析

    参数说明 :serverPath:表示服务器的文件路径 ,  localPath:表示本地的文件路径  , num 表示数字 , edition1:表示工程已经跟新的版本1 , edition2:表示 ...

  3. JSON 和 JSONP 两兄弟

    项目中遇到这个新事物,转一篇不错的总结,原文 如今ajax威风凛凛 但说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决? 这两个问题目前都有不同 ...

  4. StringMVC(拦截器)

    单个拦截器 使用jar包 创建FirstController.java @Controller public class FirstController { @RequestMapping(" ...

  5. 无线hacking系统—wifislax

    简介 官方中文网站: http://wifislax.cn/ WiFiSlax 是在Slax基础上定制出来的,由西班牙开发.它包含了各种各样的安全和诊断工具.该发行主要的成名原因是把各种各样的非官方网 ...

  6. [M]带属性块参照的转换

    有一张表格,表格的每一行都由带有属性的块参照组成,如图: 魔法表格不能直接识别有块参照组成的表格,需要使用 EXPLODE 命令将块参照分解,但多分解带有属性的块只能得到属性的定义 这是就需要使用 B ...

  7. 关于mac地址的一点感想

    因为怕mac地址冲突导致环路影响,所以修改了本地设备的mac地址.地址修改为 77:77:77:00:22:11, 结果导致 wlan0 下发不下来. 查看配置选项/etc/config/wirele ...

  8. ****K - Alien's Organ

    K - Alien's Organ Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Sub ...

  9. WPF 命令的简单总结

    WPF的命令Command主要解决的问题,就是代码复用.一个很重要的应用意义,在于它将很多地方需要的调用的相同操作,以统一的方式管理,却又提供了不同的访问结果. 举个例子来说,我可能通过“点击butt ...

  10. 10s后自动跳转

    <div class="jf_register"> <h2>您好,欢迎光临<fmt:message key="b2cShowName&quo ...