B树、B+树、B*树
2016-06-15 20:50
295 查看
B树
B树是一种平衡多路查找树,满足下列性质:
(1)每个结点的关键字降序排列;
(2)第i个孩子的所有关键字<= 父结点中第i个关键字<=第i+1个孩子的所有关键字;
(3)所有的叶子结点都在同一层;
(4)含有p个关键字的结点有p+1个孩子结点;
(5)最小度用t(>=2)来表示,最小度即关键字最少的内结点的孩子数目。根结点的关键字个数为[1,2t-1],非根结点的关键字个数为[t-1, 2t-1]。
B树的高度:设总共有n个关键字,最小度为t,深度为0时,结点数为1,深度为1时,结点数为2,深度为2时,结点数为2t,...深度为h时,结点数为2*t的h-1次方。所以我们有n >= 1+(t-1)(2+2t+...+2t h-1(t的h-1次方)) = 2t h - 1(t的h次方),h <= log以t为底,(n+1)/2的对数。
树的高度低了,I/O次数就会减少,所以在文件索引时会用到B树,以减少磁盘的访问次数。
B树的操作:(1)B树的查找,根据B树的性质2:第i个孩子的所有关键字<=父结点中第i个关键字<=第i+1个孩子的所有关键字。进行查找。
(2)B树的插入,根据结点关键字的限制条件,在插入关键字的过程中会遇到分裂结点,将待插入结点分裂为各含有t-1个关键字的结点,中间关键字提升到父亲结点中。自上而下进行搜索,分裂搜索过程中遇到的每个满结点。
自上而下,避免回溯。
(3)B树的删除,根据性质4含有p个关键字的结点有p+1个孩子结点,如果没有超出范围,直接在结点中删除关键字即可,如果违反性质,就自上而下进行搜索,将搜索到的每个关键字个数为t-1的结点变为至少t个关键字,自上而下,避免回溯。
B+树
一颗m(m是所有结点中的最大孩子数)阶的B+树满足:
(1)结点关键字个数为[m/2, m],根结点至少有两个关键字;
(2)结点的关键字个数与子树个数相同且非降序排序;
(3)叶结点在同一层并包含所有关键字且顺序链接;
(4)所有的非叶子结点可看成索引部分,结点中仅含有其子树中的最大关键字。
B+树操作:(1)B+树查找,从最底层最小关键字顺序查找,从根结点开始索引查找,要查到叶子结点。
(2)B+树插入,插入关键字只在叶子结点进行,未超出范围,直接插入,超出范围分裂,类似B树。
(3)B+树删除,删除关键字只在叶结点上进行,如果未破坏B+树性质,直接删除,修改父结点的值;如果破坏性质,兄弟可借,从兄弟结点借调,修改其父亲结点的关键字,如果兄弟不够借,与其兄弟合并,并调整键值。
B+树应用:
(1)B+树多应用于数据库中,由于B+树的遍历只需要将叶结点顺序遍历,而B树却需要中序遍历,显然,B+树更适合扫库。
(2)B+树中还有一个范围查询,比如查3~7之间的数据,B+树只需标记3和7的位置,顺序查一遍就可以,而B树就麻烦的多。
B*树
在B+树内部结点再增加指向兄弟结点的指针,B*树定义了结点关键字个数为[2m/3, m],空间利用率更高。
(1)B+树插入,只在叶结点上进行,超出范围,则看左右兄弟是否满了,未满,则将部分数据移动到兄弟结点中,修改父结点的值;兄弟满了,则各复制1/3关键字到新结点中,修改父结点的值。
总结
B树,叶子结点链接,推广到B+树,B+树兄弟结点链接,推广到B*树。
B树是一种平衡多路查找树,满足下列性质:
(1)每个结点的关键字降序排列;
(2)第i个孩子的所有关键字<= 父结点中第i个关键字<=第i+1个孩子的所有关键字;
(3)所有的叶子结点都在同一层;
(4)含有p个关键字的结点有p+1个孩子结点;
(5)最小度用t(>=2)来表示,最小度即关键字最少的内结点的孩子数目。根结点的关键字个数为[1,2t-1],非根结点的关键字个数为[t-1, 2t-1]。
B树的高度:设总共有n个关键字,最小度为t,深度为0时,结点数为1,深度为1时,结点数为2,深度为2时,结点数为2t,...深度为h时,结点数为2*t的h-1次方。所以我们有n >= 1+(t-1)(2+2t+...+2t h-1(t的h-1次方)) = 2t h - 1(t的h次方),h <= log以t为底,(n+1)/2的对数。
树的高度低了,I/O次数就会减少,所以在文件索引时会用到B树,以减少磁盘的访问次数。
B树的操作:(1)B树的查找,根据B树的性质2:第i个孩子的所有关键字<=父结点中第i个关键字<=第i+1个孩子的所有关键字。进行查找。
(2)B树的插入,根据结点关键字的限制条件,在插入关键字的过程中会遇到分裂结点,将待插入结点分裂为各含有t-1个关键字的结点,中间关键字提升到父亲结点中。自上而下进行搜索,分裂搜索过程中遇到的每个满结点。
自上而下,避免回溯。
(3)B树的删除,根据性质4含有p个关键字的结点有p+1个孩子结点,如果没有超出范围,直接在结点中删除关键字即可,如果违反性质,就自上而下进行搜索,将搜索到的每个关键字个数为t-1的结点变为至少t个关键字,自上而下,避免回溯。
B+树
一颗m(m是所有结点中的最大孩子数)阶的B+树满足:
(1)结点关键字个数为[m/2, m],根结点至少有两个关键字;
(2)结点的关键字个数与子树个数相同且非降序排序;
(3)叶结点在同一层并包含所有关键字且顺序链接;
(4)所有的非叶子结点可看成索引部分,结点中仅含有其子树中的最大关键字。
B+树操作:(1)B+树查找,从最底层最小关键字顺序查找,从根结点开始索引查找,要查到叶子结点。
(2)B+树插入,插入关键字只在叶子结点进行,未超出范围,直接插入,超出范围分裂,类似B树。
(3)B+树删除,删除关键字只在叶结点上进行,如果未破坏B+树性质,直接删除,修改父结点的值;如果破坏性质,兄弟可借,从兄弟结点借调,修改其父亲结点的关键字,如果兄弟不够借,与其兄弟合并,并调整键值。
B+树应用:
(1)B+树多应用于数据库中,由于B+树的遍历只需要将叶结点顺序遍历,而B树却需要中序遍历,显然,B+树更适合扫库。
(2)B+树中还有一个范围查询,比如查3~7之间的数据,B+树只需标记3和7的位置,顺序查一遍就可以,而B树就麻烦的多。
B*树
在B+树内部结点再增加指向兄弟结点的指针,B*树定义了结点关键字个数为[2m/3, m],空间利用率更高。
(1)B+树插入,只在叶结点上进行,超出范围,则看左右兄弟是否满了,未满,则将部分数据移动到兄弟结点中,修改父结点的值;兄弟满了,则各复制1/3关键字到新结点中,修改父结点的值。
总结
B树,叶子结点链接,推广到B+树,B+树兄弟结点链接,推广到B*树。
相关文章推荐
- 用户态文件系统fuse学习
- 关于 包、帧、数据报、段和消息 的概念区别
- N-Queens II
- JavaBasic
- 基本选择工具
- 设计模式-4-抽象工厂
- Android开发学习笔记之通过API接口将LaTex数学函数表达式转化为图片形式
- Reect Ajax render 传递数据到子Component 获取不到数据
- C#获取程序运行时间
- 如何修改vim中tab键的距离
- 自行车码表
- 图片人脸检测 (I)【sample改版 人眼检测】
- 蒟蒻的读入优化模板
- C++的多态
- 图像的轮廓检测
- 图像处理和图像识别中常用的OpenCV函数
- Spring MVC的实现原理
- Linux下find命令详解
- 关于UIView位置信息的总结和CATransform3D初步认识
- android Fragment 源码分析