zoukankan      html  css  js  c++  java
  • 数据结构(六):复杂树之B+B-树

     

    一、 B-树概述

      B-树是在2-3树的基础上,一个结点允许多个键(>=3)存在的树状数据结构。

    二、 B-树特性

    • B-树允许一个结点存在>=3个键
    • 一颗M阶的B-树,存在M-1层的树层级
    • 一颗M阶的B-树,每个结点最多有M-1个键,并且升序排列
    • 每个结点最多能有M个子结点
    • 根结点至少有两个子结点

      如下为一颗M=5阶的B-树示意图

       

      如下为一颗M=5阶的B-树存储数据的示意图

       

      插入13,21

       

      插入40

       

    三、 B-树的应用场景

      计算机中文件是存储在磁盘上的,计算机通过操作文件系统对磁盘上的文件进行增删改操作,文件系统就是使用的B-树。

      由于存储介质特性,磁盘读取比主存要慢很多,为了减少磁盘I/O,磁盘不会按需读取,而是会有预读操作,即使只需要一个字节,磁盘也会从该位置开始,向后读取一定长度的数据放入主存

      这是根据计算机中的局部性原理:当一个数据被使用时,其附近的数据也通常会被马上使用。因此预读可以提高I/O效率。

      页是计算机存储的逻辑块,磁盘存储区被分割为大小相等的块,每个存储块为一页,通常是1024个字节或其整数倍,预读长度一般为页的整倍数。主存和磁盘以页为单位交换数据。

      当读取的数据不在主存中时,会触发缺页异常并向磁盘发出信号,磁盘会将数据读取的起始位置处往后的几页数据读取并载入内存中。

      为什么B-树更适用于文件系统读取,假设有10亿个数据,那么一个1024阶的B-树读完只需要三层,而二叉树需要20层,B-树对于大数据量的读取,优势还是非常明显的。

    四、 B+树概述

      B+树是B-树的变形树,B+树中非叶子结点的父结点只存索引,不存具体数据。

    五、 B+树和B-树区别和优劣

      区别:

      1、B+树中非叶子结点的父结点只存索引,不存具体数据

      2、B+树所有叶子结点构成一个有序链表,可在最左的叶子结点有序的往后遍历

      如图所示为B+树和B-树数据存储上的区别

       

      继续插入18

       

      优劣:

      B+树相比B-优点在于:B+树非叶子结点不存储数据,只存索引,因此内存空间复杂度小,又因为叶子结点组成了有序链表,对整棵树的遍历,只需一次性遍历叶子结点即可。

      B+树相比B-缺点在于:B-树每个结点都包含Key和Value,因此当我们遍历匹配到Key时就可以直接获取到值,而无需像B+树一样,需遍历到叶子结点才能获取到value。

    六、 B+树的应用场景

      数据库主键索引查询:

      在如下的数据库表中,若要找到id=18的username,需要遍历6次

    userid

    username

    7

    cat

    3

    dog

    10

    monkey

    12

    rabbit

    22

    lion

    18

    tiger

    8

    fish

      而对这部分数据转化为B+树存储后,如下图,只需根据根结点索引,找到id=12的树节点并往后遍历1次即可,在性能上有很大的优化

       

  • 相关阅读:
    搭建 mariadb 数据库主从同步
    MySQL--MVCC
    剑指 Offer 07. 重建二叉树
    剑指 Offer 06. 从尾到头打印链表
    MySQL--数据库范式
    剑指 Offer 05. 替换空格
    剑指 Offer 04. 二维数组中的查找
    剑指offer_03_数组中重复的数字(Java)
    Redis
    MySQL--SQL执行过程
  • 原文地址:https://www.cnblogs.com/jiyukai/p/14056534.html
Copyright © 2011-2022 走看看