数据结构-树(三):多路搜索树B树、B+树

 更新时间:2019年04月11日 09:23:38   作者:A-Coder  
这篇文章主要介绍了多路搜索树B树、B+树,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

多路搜索树

  1. 完全二叉树高度:O(log2N),其中2为对数
  2. 完全M路搜索树的高度:O(logmN),其中M为对数,树每层的节点数
  3. M路搜索树主要用于解决数据量大无法全部加载到内存的数据存储。通过增加每层节点的个数和在每个节点存放更多的数据来在一层中存放更多的数据,从而降低树的高度,在数据查找时减少磁盘访问次数。
  4. 所以每层的节点数和每个节点包含的关键字越多,则树的高度越矮。但是在每个节点确定数据就越慢,但是B树关注的是磁盘性能瓶颈,所以在单个节点搜索数据的开销可以忽略。

 B树

B树是一种M路搜索树,B树主要用于解决M路搜索树的不平衡导致树的高度变高,跟二叉树退化为链表导致性能问题一样。B树通过对每层的节点进行控制、调整,如节点分离,节点合并,一层满时向上分裂父节点来增加新的层等操作来来保证该M路搜索树的平衡。具体规则如下:

  1. 根节点的儿子树个数在2到M之间,其他非叶子节点的儿子树个数在M/2和M之间。如果儿子树个数因为分裂超过了M则此时需要向上递归分裂父节点,当找到一个不需要再分裂的父节点则停止分裂。该分裂过程直到根节点,如果需要分裂根节点,则会产生两个根,故需要创建一个新的根来将这两个根作为儿子节点,此时树的高度会增加1。
  2. 每个非叶子节点的关键字的值从左到右依次变大,第i个关键字代表子树i+1中的最小关键字;(其中对于根节点来说i在1到(2到M)之间,其他非叶子节点则是1到(M/2到M)之间);
  3. B树的所有数据项都存放到叶子节点,非叶子节点不存放数据,非叶子节点只存放用于指示搜索方向的关键字,即索引。这样有利于将更多的非叶子节点加载到内存中,方便进行数据查找;
  4. 所有叶子节点都在相同的深度并且每个叶子节点包含L/2到L项数据。

 M和L的大小选择

  1. M为B树的阶数或者说是路数
  2. L为每个叶子节点最多存放的数据项个数
  3. 在B树中,每个节点都是一个磁盘区块,所以需要根据磁盘区块的大小来决定M和L。

 磁盘区块大小与M的计算

  1. 每个非叶子节点存放了关键字和指向儿子树的指针,具体数量为:M阶的B树,每个非叶子节点存放了M-1个关键字和M个指向儿子树的指针,故加入每个关键字的大小为8字节(如Java的long类型就是8字节),每个指针为4字节,则M阶B树的每个非一叶子节点需要:8 * (M-1) + 4 * M = 12M - 8个字节。
  2. 如果规定每个非叶子节点(磁盘区块)占用内存不超过8K,即8192,则M最大为683,即683*12-8=8192。

 叶子节点数据项个数L

  1. 假如每个数据项大小也是256字节,则由于磁盘区块大小为8K,即8192个字节,而每个叶子节点可以存放L/2到L个数据项,所以每个叶子节点最多存放:8192/256=32个数据项,即L的大小为32。
  2. 一棵5阶的B树的结构如下,即M和L等于5:其中每个非叶子节点包含最多M-1=5-1=4个关键字,包含M,即5个指向子树指针。L等于5,则每个叶子节点最多存放5个数据项。

 

B+树

B+树结构跟B树基本一致,唯一的区别是B+树的叶子节点之间通过指针相连形成一个链表,故便于遍历所有的叶子节点,即获取所有或者搜索关键字某一范围的所有数据项。MySQL的InnoDB存储引擎就是会用B+树作为索引实现。

以上所述是小编给大家介绍的多路搜索树B树、B+树详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • mysql 8.0.11 MSI版安装配置图文教程

    mysql 8.0.11 MSI版安装配置图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.11 MSI版安装配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • MYSQL数据库管理之权限管理解读

    MYSQL数据库管理之权限管理解读

    这篇文章主要介绍了MYSQL数据库管理之权限管理解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 详解CentOS6.5 安装 MySQL5.1.71的方法

    详解CentOS6.5 安装 MySQL5.1.71的方法

    这篇文章主要介绍了CentOS6.5 安装 MySQL5.1.71的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • mysql去除重复数据只保留一条数据实例

    mysql去除重复数据只保留一条数据实例

    这篇文章主要给大家介绍了关于mysql去除重复数据只保留一条数据的相关资料,在使用MySQL时,有时需要查询出某个字段不重复的记录,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • MySQL图形化管理工具的使用及说明

    MySQL图形化管理工具的使用及说明

    这篇文章主要介绍了MySQL图形化管理工具的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 深入探索数据库MySQL性能优化与复杂查询相关操作

    深入探索数据库MySQL性能优化与复杂查询相关操作

    数据库MySQL 是一种开源的关系型数据库管理系统,在进行 MySQL 数据库开发过程中,需要深入了解如何进行性能优化和复杂查询,以提高系统的效率和可靠性,本文介绍的非常详细,需要的朋友可以参考一下
    2023-04-04
  • mysql 分组函数和分组查询使用详解

    mysql 分组函数和分组查询使用详解

    分组函数用作统计使用,又称聚合函数,统计函数,组函数,这篇文章主要介绍了mysql分组函数分组查询的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • MySQL巧用sum、case和when优化统计查询

    MySQL巧用sum、case和when优化统计查询

    这篇文章主要给大家介绍了关于MySQL巧用sum、case和when优化统计查询的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Mysql使用索引实现查询优化

    Mysql使用索引实现查询优化

    索引的目的在于提高查询效率,本文给大家介绍Mysql使用索引实现查询优化技巧,涉及到索引的优点等方面的知识点,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-07-07
  • MySQL中union和join语句使用区别的辨析教程

    MySQL中union和join语句使用区别的辨析教程

    这篇文章主要介绍了MySQL中union和join语句的用法区别,举例说明了union和join在连接操作上的不同作用,需要的朋友可以参考下
    2015-12-12

最新评论