树形索引(B+树)

来源:互联网 发布:mt4编程书籍 编辑:程序博客网 时间:2024/05/22 15:12

一棵m阶的B+树和m阶的B-树的异同点在于:

      1.n棵子树的结点中含有个关键字,即每个关键码对应一颗子树

      2.所有的终端结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且终端结点本身依关键字的大小自小而大的顺序链接。 (而B- 树的叶子节点并没有包括全部需要查找的信息)

      3.所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B- 树的非终节点也包含需要查找的有效信息)

      4.所有外结点均不是空指针,而是作为指向关键码所对应记录在文件中的位置指针。

由于在m阶B+树中,每个结点最多有m棵子树,故,m阶B+树的结点所含关键码的最大个数为m,而在m阶B-树的结点中所含关键码的最大个数为m-1.m阶B+树的结点所含关键码的个数n的最大值可为m。

  (1)根结点只有1个,分支数量范围[2,m]。

        (2)除根以外的非叶子结点,每个结点包含分支数范围[[m/2],m],其中[m/2]表示取大于m/2的最小整数。

        (3)所有非叶子节点的关键字数目等于它的分支数量。

        (4) 所有叶子节点都在同一层,且关键字数目范围是[[m/2],m],其中[m/2]表示取大于m/2的最小整数。

        (5)所有非叶子节点的关键字可以看成是索引部分,这些索引等于其子树(根结点)中的最大(或最小)关键字。例如一个非叶子节点包含信息: (n,A0,K0, A1,K1,……,Kn,An),其中Ki为关键字,Ai为指向子树根结点的指针,n表示关键字个数。即Ai所指子树中的关键字均小于或等于Ki,而Ai+1所指的关键字均大于Ki(i=1,2,……,n)。

        (6)叶子节点包含全部关键字的信息(非叶子节点只包含索引),且叶子结点中的所有关键字依照大小顺序链接(所以一个B+树通常有两个头指针,一个是指向根节点的root,另一个是指向最小关键字的sqt)。




B+树

查找:在B+树上查找时,若在非终端结点上有关键码等于给定值,并不终止,而是继续向下直到终端结点。因此,在B+树上不管查找成功与否,每次查找都是走了一条从根节点到终端结点的路径。

插入:B+树插入仅在终端节点上进行,当终端节点中关键码个数大于m时要分裂成两个结点(插入后含m+1个关键码):若m为奇数,则分裂所得两个结点所含关键码个数均为(m+1)/2;若m偶,则分为m/2和m/2+1个。它们双亲结点中应同时包含这两个节点中的最大关键码。


在深度大于1的B+树上插入一个比根节点上最大关键码还要大的关键码时,为不破坏B+树特性:将根至终端结点路径上结点(不包括终端结点)中的原最大关键码改为新插入的较大关键码,而仅在终端结点中将新插入的较大关键码加在原最大关键码之后,然后检查终端结点是否满足m阶B+树定义要求。若加入后,关键码个数仍小于或等于m,则不需分裂结点,若加入后终端结点中关键码个数为m+1,则对该终端结点进行分裂-提升操作。

删除:仅在终端结点进行。当终端结点最大关键码被删,则在非终端结点中的值(即为该最大关键码)可作为一个“分界关键码”存在。若为B+树的组织严格,可将次大关键码提升到其父结点代替原来的最大关键码,进一步上传直至根结点。若因删除,使结点中关键码个数少于[m/2],进行合并操作。

B+树特适合范围查找。一旦找到范围中第一个关键码及记录,就可在该终端结点或顺着该终端结点往后的连接指针,根据范围的上界值,快速找出所给范围内的所有关键码及记录。

用途:B+ 树通常用于数据库和操作系统的文件系统中。NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系统都在使用B+树作为元数据索引。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入。

B+树主要用于磁盘,拆分意味着磁盘的操作,应该在可能的情况下尽量减少页的拆分。




原创粉丝点击