关于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. accept阻塞

    一直以来以为accept阻塞的时候,若另有线程关闭相应的监听套接字,accept会立即返回. 今天先是在NDK上试,没反应.又在ARCHLINUX试了下,还是没反应.难道是我一直记的都是错的!!!!! ...

  2. Python基础(八)装饰器

    今天我们来介绍一下可以提升python代码逼格的东西——装饰器.在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义. 一.知识点复习 1, 在函数中f1和f1()有什么不同,f ...

  3. IDEA建立一个可运行的struts2项目

    参考博客:https://blog.csdn.net/shuai_wy/article/details/79027573 直接使用IDEA创建struts2项目,配置好tomcat后是跑不起来的 需要 ...

  4. App后台开发运维和架构实践学习总结(3)——RestFul架构下API接口设计注意点

    1. 争取相容性和统一性 这里就要求让API设计得是可预测的.按照这种方式写出所有接口和接口所需要的参数.现在就要确保命名是一致的,接口所需的参数顺序也是一致的.你现在应该有products,orde ...

  5. Java基础学习总结(76)——Java异常深入学习研究

        异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 异常处理的流程     当程序中抛 ...

  6. 解决使用myeclipse电脑卡的问题

    1. 原因:myeclipse会自动更新,因此会占用大量内存 2. 解决方法: (1)window->Perferences->General->Startup and Shutdo ...

  7. hust 1017

    题意:求01矩阵的精确覆盖. 分析:本来想学习dancing links来解决数独问题,发现dancing links最初解决的问题是精确覆盖,于是就找到这道题来做了.这种NPC问题只能用DFS暴搜的 ...

  8. 3、Java并发性和多线程-多线程的代价

    以下内容转自http://ifeve.com/costs-of-multithreading/: 从一个单线程的应用到一个多线程的应用并不仅仅带来好处,它也会有一些代价.不要仅仅为了使用多线程而使用多 ...

  9. 两张图让git新手在项目中运用git命令行

    创建分支命令:    git branch (branchname) 切换分支命令:      git checkout (branchname) 当你切换分支的时候,Git 会用该分支的最后提交的快 ...

  10. android 线程的开启和停止(借鉴java的技术)

    在onclick()点击事件中的 // 上传地理位置 case R.id.person_up_locat: System.out.println("====输出了.. .. ====&quo ...