B+ 树是一种树数据结构,是一个n叉树,每个节点通常有多个孩子,一棵B+树包含根节点、内部节点和叶子节点。根节点可能是来自一个叶子节点,也可能是一个包含两个或两个以上孩子节点的节点。
B+ 360百科树通常用于数据库和操作月基特系统的文件系统中。NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系统都在使用B+树作为元数据索引。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入。
B+树是应文件系统所需而出的来自一种B树的变型树。一棵m阶的B+树和m阶的B-树的差异在于:
1.有n棵子树的结点中含有n个关键字360百科,每个关键字不保存数据,只用来索引,所有数据都保存在叶子节巴衡规检最点。
2.所有的叶子结点中包含了全部关键字的信息,及指建米药杆会工底唱结向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的非终端结点可以看成是索引部分,结点中仅含其子树(根结点)中的最大(或最小)关键字。
通常在B+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
对B+树可以进行两种查找运算:
1.从最小关键字起顺序查找;
2.从根结点开始,进行随机查找。
在查找时,若非终端结点上的关键值等于给定值,并不终止,而是继续向下直到叶子结点。因此,在B+树中,不管查找成功与否,每次查找都是走了一条从根到叶子结点的路径。其余同B-树的查找类似。
以下是从根节点查找叶子节点k的伪代码 :
m阶B树的插入操作在叶子结点上进行,假设要插入关键值a看只迅与,找到叶子结点后插入a,做如下算法判别:
①如果当前厂右说船钟能介结点是根结点并且插入后结点关键字数目小于等于m,则算法结束;
②如果当前结点是非根结点并且插入后结点关键字数目小于等于m,则判断若a是新索引值时转步骤④后结束,若a不是新索引值则直接结束;
③如果插入后关键字数目大于m(阶数),则结点先分裂成两个结点X和Y,并且他们各自所含的关键字个数分别为:u=大于(m+1)/2的最小整数,v=小于(m+1)/2的最大整数;
由于索引值位于结点的最左端或者最右端,不妨假设索引值位于结点最右端,有如下操作至粒模互肉论展:
如果当前分裂成的X和Y结点原来所属的结点是根结点,则从X和Y中取检任核出索引的关键字,将这两个关键字组成新的根结点,并且这个根结点指向X和Y,算法结束;
如果当前分裂成的X和Y结点原来所属的结点是非根结点,依据假设条件判断,如果a成钱断风坏买善为Y的新索引值,则转步骤④得到Y的双亲结点测茶教活P,如果a不是Y结点的新索引值,则求出X和Y结点的双亲领许雨亮结点P;然后提取X结点中的德质维事艺新索引值a',在P中插入关键字a',从P开始,继续进行插入算法;
④提取结点原来的索引值b,自顶向下,先判断根是否含有b,是则需要先将b替换为a,然后从根结点开始,记录结点地址P,判断P的孩子是否含有索引值b而不含有索引值a,是则先将孩子结点中的b替换为a,然后将P的孩子的地址赋值给P,继续搜索,直到发现P的孩子中已经含有a值时,停止搜索,返回地址P。
B+树按讲法石停并无资的删除也仅在叶子结点进行,当叶子结点中的最大关键字被删除时,其在非终端结点中的值可以作为一个"分界关键字"存在。若因删除而使结点中关键字的个数少于m/2 (m/2结果取上界,如5/2结果为3)时,其和兄弟结点的合并过程亦和B-树类似。
一棵m阶的B+树和m阶的B树的异同点在于:
为什么说B+树比B 树更适合实际应用中操作系统的文件索引和数据库索引?