B-Tree 漫谈 (从二叉树到二叉搜索树到平衡树到红黑树到B树到B+树到B*树)
关于B树的学习还是需要做点笔记。
B树是为磁盘或者其他直接存取辅助存储设备而设计的一种平衡查找树。B树与红黑树的不同在于,B树可以有很多子女,从几个到几千个。比如一个分支因子为1001,高度为2的B树,他可以存储超过10亿个关键字,尽管如此,因为根节点(只有一个)保留在主存中,故这可书中,寻找某一个关键字之多需要两次磁盘存取。

关于磁盘的结构,以及写入,读取数据的原理,这里就略过了。
一、概述:
1) 对于B树的每个节点x有:
a)n[x],当前存储在结点x中的关键字数,
b)关键字以非降序存放,因此 key1[x]<=key2[x]<=...<=keyn[x]
c) leaf[x],是一个布尔值,用来表示结点x是不是叶子节点。
2) 每个内结点包含n[x] + 1个指向其子女的指针 c1[x], c2[x], ... ,c (n[x]+1) [x]。当然叶节点没有c的定义。
3) keyi[x]对存储在各子树中的关键字范围加以分隔。
4) 每个叶节点具有相同的高度。
5)每个节点能包含的关键字数具有一个上界和一个下界。这些界可以用一个称作B树的最小度数的固定整数t >=2 来表示。
定理:h <= log t底 (n+1)/2。 证明略。详见 算法导论。
二、基本操作:
B树与搜索二叉查找树很相似,之时在每个节点所做的不是“二路选择”而是“根据子女数目做多路选择”。
1) 创建一棵空 B树:
首先创建一个空的根结点,再调用INSERT插入新的关键字。最后DISK-WRITE写入
2) 插入:
将新的节点插入到树中,当然是在不违反B树的有效性的前提下。那么如果新节点将要插入的节点y是一个满的叶节点,
故需要引入一个“分裂”操作,将该节点从中间的关键字keyt[y]分为两个各含t-1个关键字的节点。中间关键字被提升
到y的双亲结点。当然,如果y的双亲结点也是满的,那么就要保证在y做分裂操作之前就保证双亲已经通过分裂操作变得不满。
为了满足以上要求:当我们在由上向下查找当前新结点的归属时,就将沿途的满节点分裂,那么就可以保证每当要分裂一
个满结点y时,确保它的双亲不是满的。可以见得:树长高的唯一方式就是 分裂 根节点。
首先,创建一个新结点z, 然后将原来y节点中的 t ... 2t - 1 (t- 1)个关键字剪贴至新结点z,然后将中间关键字放入y的
父节点中。
对B树用单程下行遍历树方式插入关键字:
直接上图了吧。来自 --《算法导论》

一图胜千言啊。
4)删除操作
对于结点x递归调用B-Tree-Delete后,x的关键字个数至少等于最小度t。注意!这个要求比之前的要求(B树中最少关
键字个数t-1)多了一个,使得有时在递归降至某节点的一个子节点之前,一个关键字必须转移到子节点内。这个加强的条件
允许我们在一趟下降的过程中,就可以将一个关键字从树中删掉。

删除操作稍微复杂一点。总结一下复杂度:对于一棵高度为h的B树,它只需要O(h)次磁盘存取操作。所需CPU时间为O(th) = O(tlogt n)。
B-Tree 漫谈 (从二叉树到二叉搜索树到平衡树到红黑树到B树到B+树到B*树)的更多相关文章
- 二叉搜索树、平衡二叉树、红黑树、B树、B+树
完全二叉树: 空树不是完全二叉树,叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部.如果遇到一个结点,左孩子不为空,右孩子为空:或者左右孩子都为空:则该节点之后的队列中的结点都为叶子 ...
- 二叉树、二叉搜索树、平衡二叉树、B树、B+树的精确定义和区别探究
概述 关于树的概念很多,B树,B+树,红黑树等等. 但是你去翻翻百度百科,或者用百度或者谷歌搜索一下中文的树结构的介绍,全都是狗屁.没有哪个中文网站是真正精确解释树的定义的,尤其是百度百科. 下面我要 ...
- 41.Validate Binary Search Tree(判断是否为二叉搜索树)
Level: Medium 题目描述: Given a binary tree, determine if it is a valid binary search tree (BST). Assu ...
- 二叉树系列 - 二叉搜索树 - [LeetCode] 中序遍历中利用 pre节点避免额外空间。题:Recover Binary Search Tree,Validate Binary Search Tree
二叉搜索树是常用的概念,它的定义如下: The left subtree of a node contains only nodes with keys less than the node's ke ...
- 108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树.此题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1.示例:给定有序数组: [-10,-3,0,5,9], ...
- 数据结构中的树(二叉树、二叉搜索树、AVL树)
数据结构动图展示网站 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...
- [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- [LeetCode] Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 这道 ...
- [LeetCode] 272. Closest Binary Search Tree Value II 最近的二叉搜索树的值 II
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
随机推荐
- stall and flow separation on airfoil or blade
stall stall and flow separation Table of Contents 1. Stall and flow separation 1.1. Separation of Bo ...
- codechef营养题 第三弹
第三弾が始まる! codechef problems 第三弹 一.Motorbike Racing 题面 It's time for the annual exciting Motorbike Rac ...
- Python异常捕捉的一个小问题
问题: names = ['taotao','songwenjing','liu','li']I = iter(names)while True: try: s = next(I) except Ex ...
- 这可能是vue-cli最全的解析了……
题言: 相信很多vue新手,都像我一样,只是知道可以用vue-cli直接生成一个vue项目的架构,并不明白,他究竟是怎么运行的,现在我们一起来研究一下... 一.安装vue-cli,相信你既然会用到v ...
- 阿里maven仓库配置
修改conf文件夹下的settings.xml文件,添加如下镜像配置: <mirrors> <mirror> <id>alimaven</id> < ...
- 实例:Mongodb集群配置过程
最近因为一些项目公司开始采用Mongodb做为大量的数据存储,通过网络上大量的资源自己已经掌握一套可行的Mongodb集群配置过程,Mongodb具有无规则存储.大数据存储.多平台支持.强大的扩展插件 ...
- 30、Java并发性和多线程-阿姆达尔定律
以下内容转自http://ifeve.com/amdahls-law/: 阿姆达尔定律可以用来计算处理器平行运算之后效率提升的能力.阿姆达尔定律因Gene Amdal 在1967年提出这个定律而得名. ...
- 马悦:《Linux内核分析》MOOC课程
http://www.cnblogs.com/20135235my/p/5237267.html
- 【分享】迅为iTOP4412开发板-Android系统屏幕旋转设置
1.1概述 Android4.0,Androd4.4源代码能够编译成手机模式和平板模式,讯为iTop4412 开发平台 的Android系统默认编译为平板模式.客户须要依据自己的产品设计及应用环境,切 ...
- 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展
将一个对象相同的属性(不区分大小写)赋值给一个新对象 1 public static T Mapper<S, T>(S source) 2 { 3 T t = Activator.Cr ...