<算法导论>高级数据结构--以我的角度看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 ...
随机推荐
- lampp、xampp安装文档
第一步:去官网 看这个介绍http://www.apachefriends.org/zh_cn/xampp-linux.html#1677 第二步:下载安装包 2.1 要区分Linux是32位还是64 ...
- js CacheQueue
(function(){ var CacheQueue=function(name,weightValue,maxLength,clearTimerTime){ //public this.name ...
- <LeetCode OJ> 257. Binary Tree Paths
257. Binary Tree Paths Total Accepted: 29282 Total Submissions: 113527 Difficulty: Easy Given a bina ...
- Foreach嵌套Foreach速度慢优化方案
有时候这样的效率还可以,但是只要牵涉到操作数据库,那就GAMEOVER.. 最近在维护项目,一个Foreach循环,4分半才能出来结果. 代码: foreach ($content as $key = ...
- Jquery.ajax报parseerror Invalid JSON错误的原因和解决方法:不能解析
(默认: 自动判断 (xml 或 html)) 请求失败时调用时间.参数有以下三个:XMLHttpRequest 对象.错误信息.(可选)捕获的错误对象.如果发生了错误,错误信息(第二个参数)除了得到 ...
- linux - console/terminal/virtual console/pseudo terminal ...
http://en.wikipedia.org/wiki/System_console System console Knoppix system console showing the boot p ...
- 基于faro SDK 读取fls原始文件
#define _SCL_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include <iostream> //#include ...
- MySQL系列:innodb源代码分析之线程并发同步机制
innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比較高效的并发同步机制. innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进 ...
- redis客户端连接,最大连接数查询与设置
##redis客户端连接数 redis通过监听一个TCP端口或socket的方式接收来自客户端的连接, 当与客户端建立连接后,redis内部会进行如下操作:()客户端socket会被设置为非阻塞模式, ...
- PHP 获取网络接口文件流
获取网络接口里面的文件流 php开发调用各种接口在所难免,有时须要传递非常多參数. 在传递參数过程中 '&' 有时会被 解析成 '&'导致请求失败 经过查找资料和比較,发现php提供了 ...