数据结构与算法17—B树(B、B+、B*)

B树

B-树,就是B树,B树的原英文名是B-tree,所以很多翻译为B-树,就会很多人误以为B-树是一种树、B树是另外一种树。其实,B-tree就是B树。

B-树的定义

B树(B-tree)是一种树状数据结构,是一种平衡的多路查找树,能够用来存储排序后的数据。这种数据结构能够让查找数据、循序存取、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树,可以拥有多于2个子节点。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。这种数据结构常被应用在数据库和文件系统的实作上。

一棵m阶的B-树,或为空树,或为满足下列特性的m叉树:

(1)树中每个结点至多有m棵子树(m>=2)。

(2)除非根结点为叶子结点,否则至少有两棵子树。

(3)除根之外的所有非终端结点至少有┌m/2┐棵子树。

(4)每个结点存放至少m/2-1(取上整)和至多m-1个关键字;(至少2个关键字)

(5)非叶子结点的关键字个数=指向儿子的指针个数-1;

(6)所有的非终端结点的结构如下:

其中,k1,k2,...,kn为n个按从小到大顺序排列的键值;

(7)所有叶子结点在同一个层次上,且不含有任何信息。

下图是一棵四阶(m=5)B_树的示意图,该树共有四层,所有叶子点均在第四层上。这里为了理解方便我就直接用实际字母的大小来排列C>B>A)(注:通常树结点的首位置要存储此结点的有效数据个数)

 

B树的查询流程

如上图我要从上图中找到E字母,查找流程如下

(1)获取根节点的关键字进行比较,当前根节点关键字为M,E<M(26个字母顺序),所以往找到指向左边的子节点(二分法规则,左小右大,左边放小于当前节点值的子节点、右边放大于当前节点值的子节点);

(2)拿到关键字D和G,D<E<G 所以直接找到D和G中间的节点;

(3)拿到E和F,因为E=E 所以直接返回关键字和指针信息(如果树结构里面没有包含所要查找的节点则返回null);

B树的插入(建立)节点

关键字插入的位置必定在最下 层的非叶结点,有下列几种情况:

1)插入后,该结点的关键字个数n<m, 不修改指针;

2)插入后,该结点的关键字个数 n=m, 则需进行“结点分裂”,令 s =┌m/2┐, 在原结点中保留 (A0,K1,…… , Ks-1,As-1); 建新结点 (As,Ks+1,…… ,Kn,An); 将(Ks,p)插入双亲结点;

3)若双亲为空,则建新的根结点。

例如:定义一个5阶树(平衡5路查找树),现在要把3、8、31、11、23、29、50、28 这些数字构建出一个5阶树出来

a. 先插入 3、8、31、11

b.再插入23、29

插入23时,m=5了,而因5阶树关键字数必<=5-1,所以在┌m/2┐处拆分。

c.再插入50、28

同理,插入50时,m<5,所以不用改变。而插入28时与b步骤相同。

B树节点的删除

(1) 在深度为(h+l)的m阶B-树中删除一个键值k,首先要查到键值k所在的结点及在结点中的位置。若k在非终端节点中,则把该结点的右边(或左边)指针所指子树中的最小(或最大)键值与k对调,使k移到终端节点。

(2) 在终端节点中删除一个键值后,使得该结点的值个数n减1,此时应分以下三种情况进行处理:

a. 若删除后结点中键值数目n≥ ┌m/2┐-1,在该结点中删去键值k连同右边的指针。

b. 若删除后结点中键值数目n< ┌m/2┐-1,且左(或右)兄弟结点的关键字数目> ┌m/2┐-1,则把左(或右)兄弟结点中最大(或最小)键值移到父结点中,再把父结点大于(或小于)上移键值的键值下移到被删关键字所在结点中。

c. 若删除后结点中键值数目n< ┌m/2┐-1,及其左、右兄弟结点的键值数目都等于┌m/2┐-1,则就必须进行结点的“合并”,即把应删的键值删去后,将该结点中的剩余键值和指针连同父结点中指向该结点指针的左边(或右边)一个键值ki一起合并到左兄弟(或右兄弟)结点中,将ki从父结点中删去。如果因此使父结点中关键字数目< ┌m/2┐-1,则对此父结点做同样处理,以致于可能直到对根结点做这样的处理而使整个树减少一层。

如果因此使父结点中关键字数目< ┌m/2┐-1,则对此父结点做同样处理,以致于可能直到对根结点做这样的处理而使整个树减少一层。

B树特点:

B树相对于平衡二叉树的不同是,每个节点包含的关键字增多了,特别是在B树应用到数据库中的时候,数据库充分利用了磁盘块的原理(磁盘数据存储是采用块的形式存储的,每个块的大小为4K,每次IO进行数据读取时,同一个磁盘块的数据可以一次性读取出来)把节点大小限制和充分使用在磁盘快大小范围;把树的节点关键字增多后树的层级比原来的二叉树少了,减少数据查找的次数和复杂度;

原文地址:https://www.cnblogs.com/lisen10/p/10876327.html

时间: 2024-11-04 07:29:02

数据结构与算法17—B树(B、B+、B*)的相关文章

python数据结构与算法 38 分析树

分析树 树的结构完成以后,该是时候看看它能做点什么实事儿了.这一节里,我们研究一下分析树.分析树能够用于真实世界的结构表示,象语法或数学表达式一类的. 图1 一个简单语句的分析树 图1所示是一个简单语句的层级结构,把语句表示为树结构可以让我们用子树来分析句子的组成部分. 图2 ((7+3)?(5?2))的分析树 我们也可以把数学表达式如((7+3)?(5?2))表示为分析树,如图2.此前我们研究过完全括号表达式,这个表达式表达了什么呢?我们知道乘法的优先级比加减要高,但因为括号的关系,在做乘法之

数据结构和算法17 之拓扑排序

本文为博主原创文章,转载请注明出处:http://blog.csdn.net/eson_15/article/details/51194219 这一节我们学习一个新的排序算法,准确的来说,应该叫"有向图的拓扑排序".所谓有向图,就是A->B,但是B不能到A.与无向图的区别是,它的边在邻接矩阵里只有一项(友情提示:如果对图这种数据结构部不太了解的话,可以先看一下这篇博文:数据结构和算法之 无向图.因为拓扑排序是基于图这种数据结构的). 有向图的邻接矩阵如下表所示: A B C A

【数据结构和算法】:树和二叉树定义、基本术语和性质

树的定义和基本术语 ?树:是一类重要的非线性数据结构,是以分支关系定义的层次结构. ?根:树(tree)是n(n>=0)个结点的有限集T,对于非空树,其中有且仅有一个特定的结点,称为树的根(root). ?子树:当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,--Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree).每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继. 结点:包含一个数据元素及若干指向子树的分支. 结点的度:结点子树的个数.

09-看图理解数据结构与算法系列(B树)

B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数据库或文件系统. B树特点 B树可以定义一个m值作为预定范围,即m路(阶)B树. 每个节点最多有m个孩子. 每个节点至少有ceil(m/2)个孩子,除了根节点和叶子节点外. 对于根节点,子树个数范围为[2,m],节点内值的个数范围为[1,m-1]. 对于非根节点,节点内的值个数范围为[ceil(m/

13-看图理解数据结构与算法系列(Trie树)

Trie树 Trie树,是一种搜索树,也称字典树或单词查找树,此外也称前缀树,因为某节点的后代存在共同的前缀.它的key都为字符串,能做到高效查询和插入,时间复杂度为O(k),k为字符串长度,缺点是如果大量字符串没有共同前缀时很耗内存.它的核心思想就是减少没必要的字符比较,使查询高效率,即用空间换时间,再利用共同前缀来提高查询效率. Trie树特点 根节点不包含字符,其他节点每个节点只包含一个字符. 从根节点到某一节点经过路径的字符连起来即为该节点对应的字符串. 每个节点的所有子节点字符都不相同

10-看图理解数据结构与算法系列(B+树)

B+树 B+树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点.内部节点和叶子节点.多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引,增加缓存命中率.另外因为叶子节点相连遍历操作很方便,而且数据也具有顺序性,便于区间查找. B+树特点 B+树可以定义一个m值作为预定范围,即m路(阶)B+树. 根节点可能是叶子节点,也可能是包含两个或两个以上子节点的节点. 内部节点如果拥有k个关键字则有k+1个子节点. 非叶子节点不保存数据,只保存

08-看图理解数据结构与算法系列(2-3树)

2-3树 2-3树,是最简单的B-树,其中2.3主要体现在每个非叶子节点都有2个或3个子节点,B-树即是平衡树,平衡树是为了解决不平衡树查询效率问题,常见的二叉平衡书有AVL树,它虽然提高了查询效率,但是插入操作效率不高,因为它需要再每次插入节点后维护树的平衡,而为了解决查询效率同时有兼顾插入效率,于是提出了2-3树. 2-3树特点 2-3树是一棵平衡树,但不是二叉平衡树. 对于高度相同的2-3树和二叉树,2-3树的节点数要大于满二叉树,因为有些节点可能有三个子节点. 2-3树可以是一棵空树.

面试问题之数据结构与算法:B树、B+树、B*树

一.B树 B树是一种多叉平衡查找树,由于是多叉结构,对于元素数量非常多的情况下,树的深度不会像二叉结构那么大,可以保证查询效率. 二.B+树 B+是是B树的一种变形, 1.特点: (1).所有叶子结点包含全部关键字信息,及指向含有这些关键字记录的指针,且叶子节点中关键字进行有序链接. (2).非叶子结点相当于是叶子节点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层. 2.B+树比B树更适合操作系统的文件索引和数据库索引: (1)B+树的磁盘读写代价更低,B+树的内部结点没有指向关

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n(≥0)结点组成的有限集合.{N.沃恩}     (树是n(n≥1)个结点组成的有限集合.{D.E.Knuth})      在任意一棵非空树中:        ⑴有且仅有一个没有前驱的结点----根(root).        ⑵当n>1时,其余结点有且仅有一个直接前驱.         ⑶所有结