关于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*树)的更多相关文章

  1. 二叉搜索树、平衡二叉树、红黑树、B树、B+树

    完全二叉树: 空树不是完全二叉树,叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部.如果遇到一个结点,左孩子不为空,右孩子为空:或者左右孩子都为空:则该节点之后的队列中的结点都为叶子 ...

  2. 二叉树、二叉搜索树、平衡二叉树、B树、B+树的精确定义和区别探究

    概述 关于树的概念很多,B树,B+树,红黑树等等. 但是你去翻翻百度百科,或者用百度或者谷歌搜索一下中文的树结构的介绍,全都是狗屁.没有哪个中文网站是真正精确解释树的定义的,尤其是百度百科. 下面我要 ...

  3. 41.Validate Binary Search Tree(判断是否为二叉搜索树)

    Level:   Medium 题目描述: Given a binary tree, determine if it is a valid binary search tree (BST). Assu ...

  4. 二叉树系列 - 二叉搜索树 - [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 ...

  5. 108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树.此题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1.示例:给定有序数组: [-10,-3,0,5,9], ...

  6. 数据结构中的树(二叉树、二叉搜索树、AVL树)

    数据结构动图展示网站 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...

  7. [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 ...

  8. [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. 这道 ...

  9. [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 ...

随机推荐

  1. 2018.5.7每天一题面试题----final, finally, finalize 的区别

    1.final修饰符(关键字).被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承. 因此一个类不能既被abstract声明,又被final声明.将变量或方法声明为final ...

  2. 如何绘制caffe网络训练曲线

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51774966 当我们设计好网络结构后, ...

  3. [ZJOI2009]硬币游戏

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 920  Solved: 406[Submit][Status][Discuss] Descriptio ...

  4. [洛谷P1114] “非常男女”计划

    题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验.例如,据他观察,身高相近的人似乎比较合得来. 万圣节来临之际,XXX ...

  5. [bzoj2038][2009国家集训队]小Z的袜子(hose)_莫队

    小Z的袜子 hose 2009-国家集训队 bzoj-2038 题目大意:给定一个n个袜子的序列,每个袜子有一个颜色.m次询问:每次询问一段区间中每种颜色袜子个数的平方和. 注释:$1\le n,m\ ...

  6. 淘宝手机rem的如何使用

    1.主要介绍几个移动端常用的单位rem.vw.vh,配合传统的px.百分比.<viewport>标签,兼容适配移动端的各种分辨率的手机端. rm : 这个单位是以父元素为标准来进行计算 , ...

  7. 基本的文件I/O

    基本的文件 I/O 抽象基类 Stream 支持读取和写入字节. Stream 集成了异步支持. 其默认实现根据其相应的异步方法来定义同步读取和写入,反之亦然. 所有表示流的类都是从 Stream 类 ...

  8. 《从零開始学Swift》学习笔记(Day 55)——使用try?和try!差别

    原创文章.欢迎转载.转载请注明:关东升的博客   在使用try进行错误处理的时候,常常会看到try后面跟有问号(? )或感叹号(!),他们有什么差别呢? 1.使用try? try?会将错误转换为可选值 ...

  9. erlang二进制数据垃圾回收机制

    erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内.假设超过了64 bytes.就被保存到进程外的共享堆里,能够给节点内全部进程共享. erlang有两 ...

  10. Python中range和xrange的异同之处

    range     函数说明:range([start,] stop[, step]).依据start与stop指定的范围以及step设定的步长,生成一个序列. range演示样例:  >> ...