题外话:在博客园看了几篇关于B树的博文确实很有帮助,但是也看到有一些Funny的博文- -比如拿二叉树堂(BinaryTree)而皇之写上B树的帽子。

好了题归正传,B树(Balanced-Tree)与红黑树的主要不同在于,B树的节点可以有许多子女,从几个到几千个。这就是说,B树的分支因子可能会非常的大,这一分支因子往往又是由磁盘所决定的,B树与红黑树的相似之处在于,每棵含N个节点的B树的高度为O(lgn),但可能要比一棵红黑树的高度小很多,也就是意味着递归向下访问时的地址堆栈段可以节省一定的空间,因其分支因子比较大,所以B树也可以用来在O(logN)时间内,实现许多动态集合操作。

B树的几个必要的属性定义如下:

(1)首先是最重要的B树的度数,每一个B树的节点的关键字的个数不允许少于t-1个,也不允许大于2t-1个。个人讲不得不说设计B树的人实在是功夫高深,t-1和2t-1这一对神奇的数字正好构成了B树的完美分裂和合并过程。

(2)从数据结构的角度来讲,每一个B树节点的数据存储域在于一个保存关键字的个数n和一个保存子节点指针数组c[],另外一个重要的域是布尔值leaf用于表示该节点是否是一个内节点/根节点/叶结点。



一.B树的创建为以下几个步骤:

(a)在内存/进程堆中寻找一段空闲的空间来创建一个新的B树

(b)将该节点的leaf域置为true(该节点既是根节点也是叶结点),并且将n域置为0说明这是一个空的根节点,内部并没有关键字

(c)写入磁盘储存

二.B树的搜索过程(简单的递归过程,这里不多赘述)

三.B树的插入关键字过程分支步骤如下:

不妨假设访问某一个个节点的函数为(r,k)k为需要新加入的关键字

首先需要判断当前访问到的节点的关键字个数是否满足2t-1个

  Y:对当前访问到的节点及进行一次分裂的操作,即将该满节点的中间序关键字提升,如果并没有父节点的话新创建一个父节点并且将其加入至新的节点,如果有父节点    的话即将该中间序关键字提升一个高度

  N:直接进行遍历的向下递归访问插入操作,每向下访问一级都需要检查该节点是否为叶结点和关键字个数是否已经满,如果满节点的话再进行一次分裂中间序关键字提    升高度的操作,因为之前访问到的每一个节点都是经过了处理所以不会出现提升高度的关键字被插入关键字个数已经等于2t-1的父节点之中的情况。

四.B树的删除关键字过程步骤最为复杂:

假设需要删除的关键字k在于节点x中:

(1)当该节点是个叶结点的时候直接进行对k删除操作

(2)当该节点是个内节点的时候进行以下的分支操作:

  a.如果该节点x的前于k的子节点y至少包含了t个关键字,则找出k在以y为根的子树的前驱k‘来代替删除的节点k

  b.如果该节点x的后于k子节点z至少包含了t个关键字,则找出k在以y为根的子树的前驱k’‘来代替删除的节点k

  c.如果该节点x的前后yz节点的关键字个数为t-1个的时候,将该关键字向下和前驱后继合并,再从该合并的节点之中删除该关键字

如果需要删除的关键字并不在当前访问到的节点之中,我们需要分支执行以下两个步骤来保证子树的根至少含有t个关键字

  a.如果下一级需要访问的节点的只有t-1个关键字,但他的相邻兄弟子树节点含有至少t个关键字,则将父子树中的一个关键字降至下一步要访问的子树的关键字集之中,并且同时在相邻的兄弟子树节点的之中将一个关键字提升到父子树的关键字集之中。

  b.如果下一步要访问的子树都只包含t-1个关键字,则将要访问的子树节点和一个兄弟节点合并,即将父子树中的一个关键字降至两个子树之间作为中间关键字,再进行删除操作。

///////////////Extra:What if 要删除的叶结点的个数不够t-1个了呢?

<算法导论>高级数据结构--以我的角度看B树(Balanced-Tree)的建增删查的更多相关文章

  1. 数据结构与算法——常用高级数据结构及其Java实现

    前文 数据结构与算法--常用数据结构及其Java实现 总结了基本的数据结构,类似的,本文准备总结一下一些常见的高级的数据结构及其常见算法和对应的Java实现以及应用场景,务求理论与实践一步到位. 跳跃 ...

  2. 【算法导论-36】并查集(Disjoint Set)具体解释

    WiKi Disjoint是"不相交"的意思.Disjoint Set高效地支持集合的合并(Union)和集合内元素的查找(Find)两种操作,所以Disjoint Set中文翻译 ...

  3. 基本数据结构(2)——算法导论(12)

    1. 引言     这一篇博文主要介绍链表(linked list),指针和对象的实现,以及有根树的表示. 2. 链表(linked list) (1) 链表介绍      我们在上一篇中提过,栈与队 ...

  4. 算法导论第十八章 B树

    一.高级数据结构 本章以后到第21章(并查集)隶属于高级数据结构的内容.前面还留了两章:贪心算法和摊还分析,打算后面再来补充.之前的章节讨论的支持动态数据集上的操作,如查找.插入.删除等都是基于简单的 ...

  5. GO语言的进阶之路-Golang高级数据结构定义

    GO语言的进阶之路-Golang高级数据结构定义 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过Golang的基本数据类型,字符串和byte,以及rune也有所了解, ...

  6. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  7. 堆排序与优先队列——算法导论(7)

    1. 预备知识 (1) 基本概念     如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...

  8. 算法手记 之 数据结构(堆)(POJ 2051)

    一篇读书笔记 书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了 ...

  9. Python中的高级数据结构

    数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据结构,分别是List.Tuple.Dictionar ...

随机推荐

  1. setOnFocusChangeListener的使用

    类似于文本框里面hint文字在初始化的时候显示或者隐藏的操作,就要用到setOnFocusChangeListener的 首先我认为不是太必要- 毕竟当你输入东西时,默认文字自然会消失 当然假设你执意 ...

  2. ElasticSearch搜索term和terms的区别

    今天同事使用ES查询印地语的文章.发现查询报错,查询语句和错误信息如下: 查询语句:{    "query":{        "bool":{         ...

  3. CF - 420B - Online Meeting(思维)

    题意:n 个人參加线上会议.某经理记录了中间一段时间的 m 条上下线记录(1 ≤ n, m ≤ 105).+ 表示上线,- 表示下线. leader是指仅仅要有人在线,他都在线的人.求全部可能的lea ...

  4. 查看Linux上MySQL版本信息

    如果MySQL是用rpm或者yum安装的,可用 #rpm -qa|grep mysql查看. 如: [root@asd76 ~]# rpm -qa|grep mysqlmysql-5.1.73-3.e ...

  5. OSX:设置用户默认浏览器

    近期我们遇到的情况是,须要统一设置用户的默认浏览器为Google Chrome.而系统默认的是Safari. 这个设置是系统Launch Services基于用户管理的. 意思就是说,即便是改动了系统 ...

  6. Linux安装httpd2.4.10

    1. cd /mnt tar zxvf httpd-2.4.10.tar.gz ./configure --prefix=/mnt/apache2 --enable-dav --enable-modu ...

  7. iOS 依据文本内容为TextView动态定义高度

    解决方式: 1.定义一个textview,在storyboard中设定该textview的constraints. 2.将高度的constraint定义到头文件里:(直接拖拽) @property ( ...

  8. [BLE--Link Layer]物理信道

    简述 有线通信,是用电缆直接连接.然后分距离的长短.有些会须要载入波,信号也可能会经过不同的调制方式调制. 无线通信也是一样,仅仅是信号的传输是通过射频了,通过在某一频段.对无线信道进行调制,将数据发 ...

  9. 工作总结 a标签 <a href="/meetingtheme">Back to List</a> 返回上一级 指向 控制器 默认Index @Html.ActionLink("Edit59", "Edit", new { id = item.ID }) 默认当前控制器

    @Html.ActionLink("Back to List", "Index")  ----  <a href="/doctorinfo&qu ...

  10. TPM:dTPM(硬件)和fTPM(固件模拟的软件模块)

    转:Bitlocker.TPM和系统安全 自从微软在Windows Vista首次引入Bitlocker以来,它已经越来越多的出现在我们的周围.尤其是企业用户,Bitlocker的保护已经变得不可缺少 ...