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. FZU 2088 最长队名

    Problem 2088 最长队名  Problem Description Jack所在的班级决定组团报名参加FZU校赛.为了体现班级的团结和睦,班长决定用班级所有人的名字连起来组成一个史上最长最醒 ...

  2. HTML form的一些属性(第一版)

    p,li { white-space: pre-wrap } HTML表单属性总结(第一版) 基本格式为:<input type="类型" name="名字[唯一, ...

  3. 必须掌握的Linux命令

    章节简述: 本章节讲述系统内核.Bash解释器的关系与作用,教给读者如何正确的执行Linux命令以及常见排错方法. 经验丰富的运维人员可以恰当的组合命令与参数,使Linux字符命令更加的灵活且相对减少 ...

  4. 【转】Jmeter(三)-简单的HTTP请求(非录制)

    首先建立一个线程组(Thread Group),为什么所有的请求都要加入线程组这个组件呢?不加不行吗?答案当然是不行的.因为jmeter的所有任务都必须由线程处理,所有任务都必须在线程组下面创建. 选 ...

  5. linux显示行数命令

    linux 如何显示一个文件的某几行(中间几行) [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1 ...

  6. Python学习笔记——基础篇【第六周】——Subprocess模块

    执行系统命令 可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*           --废弃 com ...

  7. Python学习笔记——基础篇【第六周】——logging模块

    常用模块之logging 用于便捷记录日志且线程安全的模块 import logging logging.basicConfig(filename='log.log', format='%(ascti ...

  8. 【锋利的Jquery】读书笔记二

    一.jquery选择器 基本选择器 层次选择器 过滤选择器 基本过滤 内容过滤 可见性过滤 属性过滤 子元素过滤 first  : 获取单个元素       $("div:first&quo ...

  9. CF Round #354 Div.2

    http://codeforces.com/contest/676 A. Nicholas and Permutation 题意:有一个从1到n的数列,可以任意对调两个数字一次,问数字1和n所在位置之 ...

  10. MYSQL的一些函数

    原文地址:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html 1,字符串类的函数 CHARSET(str) //返回字串字符集CONCAT (st ...