<算法导论>高级数据结构--以我的角度看B树(Balanced-Tree)的建增删查
题外话:在博客园看了几篇关于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)的建增删查的更多相关文章
- 数据结构与算法——常用高级数据结构及其Java实现
前文 数据结构与算法--常用数据结构及其Java实现 总结了基本的数据结构,类似的,本文准备总结一下一些常见的高级的数据结构及其常见算法和对应的Java实现以及应用场景,务求理论与实践一步到位. 跳跃 ...
- 【算法导论-36】并查集(Disjoint Set)具体解释
WiKi Disjoint是"不相交"的意思.Disjoint Set高效地支持集合的合并(Union)和集合内元素的查找(Find)两种操作,所以Disjoint Set中文翻译 ...
- 基本数据结构(2)——算法导论(12)
1. 引言 这一篇博文主要介绍链表(linked list),指针和对象的实现,以及有根树的表示. 2. 链表(linked list) (1) 链表介绍 我们在上一篇中提过,栈与队 ...
- 算法导论第十八章 B树
一.高级数据结构 本章以后到第21章(并查集)隶属于高级数据结构的内容.前面还留了两章:贪心算法和摊还分析,打算后面再来补充.之前的章节讨论的支持动态数据集上的操作,如查找.插入.删除等都是基于简单的 ...
- GO语言的进阶之路-Golang高级数据结构定义
GO语言的进阶之路-Golang高级数据结构定义 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过Golang的基本数据类型,字符串和byte,以及rune也有所了解, ...
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- 算法手记 之 数据结构(堆)(POJ 2051)
一篇读书笔记 书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了 ...
- Python中的高级数据结构
数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据结构,分别是List.Tuple.Dictionar ...
随机推荐
- mybatis配置mapperLocations多个路径
<property name="mapperLocations"> <array> <value>classpath*:/mybatis-con ...
- ArcGIS教程:面积制表
摘要 计算两个数据集之间交叉制表的区域并输出表. 插图 使用方法 · 区域定义为输入中具有同样值的全部区.各区无需相连. 栅格和要素数据集都可用于区域输入. · 假设区域输入和类输入均为具有同样分辨率 ...
- iOS后台解析
iOS后台 上个月给小妹买了一台6s 她问我双击 Home 键之后 弹出的那些应用会不会耗电 我找到一篇文章 正好说的就是这个问题 摘要翻译一下 原文地址 http://www.speirs.org/ ...
- sqlite constraint
sqlite3中的约束例如以下: CREATE TABLE CheckTable (rowId integer primary key autoincrement, name text not nul ...
- apache的配置优化
[APACHE的工作方式] prefork模式(默认)这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程 ...
- 如何删除mysql 主键索引
如果一个主键是自增长的,不能直接删除该列的主键索引, 应当先取消自增长,再删除主键特性 alter table 表名 drop primary key; [如果这个主键是自增的,先取消自增长.] ...
- vue sync
1.使用vue cli建立工程 2.在APP.vue中: <template> <div class="details"> <myComponent ...
- UNP学习笔记(第十一章 名字与地址转换)
域名系统 域名系统(Domain Name System,DNS)主要用于主机名字与IP地址之间的映射. 主机名既可以是一个简单得名字,如solaris,也可以是一个全限定域名,如solaris.un ...
- c# 访问Mysql
下载Connector/Net驱动程序,并安装. 通过MySQLConnection对象来连接数据库,连接MySQL的程序的最前面需要引用MySql.Data.MySqlClient. using M ...
- Node.js 把抓取到的电影节目列表单发或者群发到QQ邮箱
代码地址如下:http://www.demodashi.com/demo/12381.html 一.前言 上一节我们演示了如何用Node的各种包去抓取电影天堂最新电影列表,接下来我们会讲解如何发送我们 ...