B+树 ,B树,数据的搜索引擎

第一节:

1.前言:

动态查找树主要有 二叉查找树(BST),平衡查找树(AVL),红黑树(Red-Black tree ),B-tree /B+tree,前三者是经典的二叉查找树的结构,B Tree/B+ tree 主要运用于 系统文件查找。
            原因在于: 大规模的数据存储中,树的结点的存储的元素数量有限的,如果采用二叉查找树的结构存储数据,导致树的深度过大,造成对磁盘I/O读写古语频繁,进而导致查询的效率低下,一种解决方案 使用 多叉树的结构,减小树的深度,扩大每一层树的结点,B树中每一结点X 不只有两个儿子结点,多个儿子 结点,与自平衡二叉查找树不同,B -树为系统最优化大块数据的读写操作,运用在数据库和文件系统中。


2.定义: B 树看成2-3 查找树的一种 扩展,允许每一个结点有M-1个子结点:

  • 根节点至少有两个子节点
  • 每个节点有M-1个key,并且以升序排列
  • 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间
  • 其它节点至少有M/2个子节点
  • 《B+树 ,B树,数据的搜索引擎》

如上图所示,一个内结点包含n[x]个关键字,那么x包含n[x]+1 个子女结点,如图 D,H包含两个关键字,其有3个子女结点.

模拟 B树查找过程:

《B+树 ,B树,数据的搜索引擎》



1.简单模拟,采用一课3叉树进行模拟,事实上每一颗B树不只有3个子女结点,发现 磁盘操作3次I/O操作和3次内存读取。

  1. 根据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。【磁盘 IO 操作 1次】     
  2. 此时内存中有两个文件名17、 35 和三个存储其他磁盘页面地址的数据。根据算法我们发现:17<29<35,因此我们找到指针 p2
  3. 根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。【磁盘IO操作 2次】    
  4. 此时内存中有两个文件名26, 30 和三个存储其他磁盘页面地址的数据。根据算法我们发现:26<29<30,因此我们找到指针 p2
  5. 根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。【磁盘IO操作 3次】    
  6. 此时内存中有两个文件名28, 29 。根据算法我们查找到文件名29,并定位了该文件内存的磁盘地址

B+树 对B树一种变形,与B树差异在于:B+树非叶子节点只有导航信息,不包含数据项,不包含实际值,
所有的叶子节点与相邻结点用链表相邻接,便于查找和遍历


1.K个子结点的结点肯定有K个关键字
2.非叶子节点作为索引,信息放在叶子节点
3.所有叶子节点 构成有序的链表
《B+树 ,B树,数据的搜索引擎》



   《B+树 ,B树,数据的搜索引擎》


为什么 B+ 树比 B树更加适合于 数据引擎搜索:


   1. B+树磁盘读写代价更加低:
         B+ 树内部结点并没有指向关键字具体信息的指针,内部结点相对于B树较小,磁盘容纳的关键字较多,一次性查找关键字越多,磁盘I/O 读写次数较少。
每一个磁盘块分配的头磁盘信息一样
  举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B树内部结点只需要1个盘快。当需要把内部结点读入内存中的时候,B 树就比B树多一次盘块查找时间(在磁盘中就是盘片旋转的时间)

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



三 . B tree 插入关键字 Key 的思路:
1. 该节点中关键码个数小于M-1,直接插入
        2.分裂:关键码个个数等于M-1,引起节点进行分裂,以中间关键字为中心将结点分为两部分,产生新的结点,将中间关键字插入到父结点中。

1、OK,下面咱们通过一个实例来逐步讲解下。插入以下字符字母到一棵空的树中(非根结点关键字数小了(小于2个)就合并,大了(超过4个)就分裂):C N G A H E K Q M F W L T Z D P R X Y S,首先,结点空间足够,4个字母插入相同的结点中,如下图:

 

《B+树 ,B树,数据的搜索引擎》

2、当咱们试着插入H时,结点发现空间不够,以致将其分裂成2个结点,移动中间元素G上移到新的根结点中,在实现过程中,咱们把AC留在当前结点中,而HN放置新的其右邻居结点中。如下图:

 

《B+树 ,B树,数据的搜索引擎》

3、当咱们插入E,K,Q时,不需要任何分裂操作

《B+树 ,B树,数据的搜索引擎》

 

 

 

 

 

 

 

 

 

 

 

 

4、插入M需要一次分裂,注意M恰好是中间关键字元素,以致向上移到父节点中

 

《B+树 ,B树,数据的搜索引擎》

5、插入F,W,L,T不需要任何分裂操作

 

《B+树 ,B树,数据的搜索引擎》

6、插入Z时,最右的叶子结点空间满了,需要进行分裂操作,中间元素T上移到父节点中,注意通过上移中间元素,树最终还是保持平衡,分裂结果的结点存在2个关键字元素。

 

《B+树 ,B树,数据的搜索引擎》

7、插入D时,导致最左边的叶子结点被分裂,D恰好也是中间元素,上移到父节点中,然后字母P,R,X,Y陆续插入不需要任何分裂操作(别忘了,树中至多5个孩子)。

 

《B+树 ,B树,数据的搜索引擎》

8、最后,当插入S时,含有N,P,Q,R的结点需要分裂,把中间元素Q上移到父节点中,但是情况来了,父节点中空间已经满了,所以也要进行分裂,将父节点中的中间元素M上移到新形成的根结点中,注意以前在父节点中的第三个指针在修改后包括DG节点中。这样具体插入操作的完成,下面介绍删除操作,删除操作相对于插入操作要考虑的情况多点。

 

《B+树 ,B树,数据的搜索引擎》

《B+树 ,B树,数据的搜索引擎》


    原文作者:B树
    原文地址: https://blog.csdn.net/qq_27217017/article/details/72845222
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞