欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

B树第二节学习(理论与思想及思路)

程序员文章站 2022-07-15 08:54:17
...

B+-tree:是应文件系统所需而产生的一种B-tree的变形树。

 

一棵m阶的B+树和m阶的B树的差异在于:

 

      1.n棵子树的结点中含有n个关键字; (B 树是n棵子树有n-1个关键字)

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

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


B树第二节学习(理论与思想及思路)
            
    
    博客分类: 数据结构 B+  B* 数据结构 B+  B* 
 

a)     为什么说B+-treeB 树更适合实际应用中操作系统的文件索引和数据库索引?

 

1) B+-tree的磁盘读写代价更低

B+-tree的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。

      举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B树内部结点只需要1个盘快。当需要把内部结点读入内存中的时候,B 树就比B树多一次盘块查找时间(在磁盘中就是盘片旋转的时间)

 

2) B+-tree的查询效率更加稳定

由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

  B+-tree的应用: VSAM(虚拟存储存取法)文件(来源论文 the ubiquitous Btree 作者:D COMER - 1979 ),如图:

 


B树第二节学习(理论与思想及思路)
            
    
    博客分类: 数据结构 B+  B* 数据结构 B+  B* 

 

B*-tree

B*-treeB+-tree的变体,在B树非根和非叶子结点再增加指向兄弟的指针;B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)。给出了一个简单实例,如下图所示:

 


B树第二节学习(理论与思想及思路)
            
    
    博客分类: 数据结构 B+  B* 数据结构 B+  B* 
 

 

B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针。

B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。

所以,B*树分配新结点的概率比B+树要低,空间使用率更高;

  • B树第二节学习(理论与思想及思路)
            
    
    博客分类: 数据结构 B+  B* 数据结构 B+  B* 
  • 大小: 42.2 KB
  • B树第二节学习(理论与思想及思路)
            
    
    博客分类: 数据结构 B+  B* 数据结构 B+  B* 
  • 大小: 19.5 KB
  • B树第二节学习(理论与思想及思路)
            
    
    博客分类: 数据结构 B+  B* 数据结构 B+  B* 
  • 大小: 40.6 KB