在前面的文章中我们已经介绍了B-Tree的一些特性,以及B-Tree的插入及删除操作。今天我们介绍一下B-Tree的一个变种 --> B+Tree。B+Tree是一种非常重要的数据结构,它广泛应用于文件系统,及数据库索引中。既然它是B-Tree的一个变种,自然他有很多特性和B-Tree就是一样的,但它们也有以下两点不同:

第一:在 B-Tree中一个含有n个子树的节点有n-1个关键字(key)。而在 B+Tree中一个含有n个子树的节点有n个关键字(key)。为什么在拥有同样子树的情况下B+Tree的节点多需要一个key呢?那是因为 B+Tree的节点会存储该节点的子树中最小的key。

第二:B-Tree的每个节点都包含了关键字(key)以及指向包含这些关键字记录的指针。而 B+Tree在叶子节点中存储了所有的关键字信息,以及指向包含这些关键字记录的指针。而且这些叶子节点构成一个有序链表,即每个叶子节点会有一个指针指向其兄弟节点。在非叶子节点中只存储了关键字信息。下面这张图画的非常好,是我从百度图片搜索而来。相信我们对照这张图看就非常清楚了。

了解了B-Tree和B+Tree的结构后,我们来看看为什么文件系统和数据库索引大量采用这种数据结构。就拿数据库的索引来说,需要创建索引一般数据量都较大,那么创建出来的索引文件也会很大,所以索引一般不可能直接存储在内存中,而是存储在硬盘上(这里我们考虑的是机械硬盘)。我们都知道硬盘的读写速度是远远赶不上内存的,一般都差了几个数量级(机械硬盘读写速度慢主要就是因为它需要通过机械臂将磁头移动到数据所在的磁道上,要详细了解磁盘的原理可以阅读这篇文章Code-lover's Learning Notes)。而我们根据索引来查询就会产生硬盘 I/O,所以要提高查询的性能就必须降低 I/O 的次数(就是要减少磁头移动的次数)。那么B树相对于其它的数据结构如AVL树,红黑树,在降低 I/O 的次数方面有什么优势呢?很明显由于B树的每一个节点能存储多个关键字信息(实际应用中每个节点都能存储几百个关键字信息,当然这个数字也不会非常大,因为它需要保证每个节点的所有关键字能在一次 I/O中就全部读取到内存中,如果需要多次 I/O 的话,那就反而会降低性能。一次 I/O 读取的数据一般为1页,而在大多数操作系统中1也=页的大小为 4 K,所以每个节点存储的关键字信息的总大小不能超过 4K)而二叉树每个节点只能存储一个关键字信息,所以在数据量很大的情况下,二叉树的高度会很大。例如根据我们前面推导的B树的一个公式,N = 1 + s * ((m/2) - 1) = 2 * (

) - 1,一个200阶的高度为4的B树最少能存储2百万个关键字信息。而同样存储2百万个关键字信息则需要一颗高度为21的二叉树。所以在这个200阶的包含2百万个关键字信息的B树中查询 I/O 的次数不会超过3次(因为根节点是常驻内存的),而同样存储2百万个关键字信息的二叉树则可能需要好几倍次数的 I/O 性能就会差很多。

在数据库索引的实现中,大部分采用的是B+Tree而不是B-Tree,这又是为什么呢?

原因有二,其一是由于B+Tree 在非叶子节点中只存储了关键字信息,而没有存储指向包含这些关键字记录的指针,所以在树的高度相同时,B+Tree往往能比B-Tree存储更多的关键字信息。更最要的原因是因为 B+Tree在叶子节点中存储了所有的关键字信息,以及指向包含这些关键字记录的指针。而且这些叶子节点构成一个有序链表,这样B+Tree在实现范围查询的时候就比较容易,只需要遍历这个有序链表就行。而B-tree要实现范围查询则比较困难,但范围查询又是数据库中比较常用的功能,所以数据库中大部分采用的是B+Tree而不是B-Tree。当然B-Tree也有强于B+tree的地方,例如在随机查询中,由于B-Tree的每个节点都包含了关键字(key)以及指向包含这些关键字记录的指针,所以B-Tree可能中途就查询到需要的数据,不需要遍历到叶子节点。而B+Tree由于只在叶子节点中存储了所有的关键字信息,以及指向包含这些关键字记录的指针。在非叶子节点中只存储了关键字信息,没有存储指向包含这些关键字记录的指针,所以B+Tree一定要遍历到叶子节点才能获取到包含这些关键字记录的指针。所以B-Tree的随机查询性能会高于B+Tree。

在B+树的基础上又演变出B*树,B*Tree在非叶子结点中也增加了指向兄弟节点的指针,并且它将非叶子节点上存储的关键字个数的最小值提高到 (2/3) * m,这样的话就提高了空间利用率。

b+tree数据结构可视化_数据结构: B+Tree及其应用相关推荐

  1. python数据结构算法_数据结构与算法(Python)

    数据结构与算法(Python) Why? 我们举一个可能不太恰当的例子: 如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰 ...

  2. java 数据结构实例_数据结构(Java)——栈的实例

    惟大英雄能本色,是真名士自风流 --易中天(百家讲坛) 1.表达式的转换 1.1 中缀表达式转前缀表达式 中缀表达式转前缀表达式有许多的方式,有加括号去除法.语法树遍历法.堆栈处理法1. 测试程序的实 ...

  3. java 数据结构 无向图_数据结构-无向图

    1.图的定义 图(Graph)是由顶点(vertex)的有穷非空集合和顶点之间边(edge)的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合 a.若顶 ...

  4. 数据结构关键路径_数据结构与算法之关键路径_一点课堂(多岸学院)

    关键路径 梳理活动的顺序仅仅是拓扑排序可以完成的功能之一,更有价值的是估量完成整个事件的最短时间.比如生产一辆汽车,虽然安排员工.准备原始材料是先行条件,但是组装各种零部件是可以同时进行的,例如制造轮 ...

  5. java实现数据结构基数排序_数据结构与算法——基数排序简单Java实现

    1 packageahe.sort;2 3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.Input ...

  6. [转]C#与数据结构--树论--平衡二叉树(AVL Tree)

    C#与数据结构--树论--平衡二叉树(AVL Tree) http://www.cnblogs.com/abatei/archive/2008/11/17/1335031.html 介绍 我们知道在二 ...

  7. c语言 数据结构 list、queue、tree抽象数据类型的定义与实现 详尽代码和注释

    本文使用c语言定义并实现list.queue.tree抽象数据类型,代码有详尽注释,可以通过代码熟悉原理并运用数据结构. 0.ADT基础知识 类型包括两类信息,属性和操作.在编程时,根据编程问题匹配合 ...

  8. 可视化的数据结构和算法

    导读:作者陈皓之前写过关于可视化排序的一篇文章,现在他又给大家罗列出可视化的数据结构和算法来供大家学习参考.文中分别从基础.索引.排序.动态编程等方面进行描述. 文章内容如下: 还记得之前发布过的那个 ...

  9. Algorithms_基础数据结构(03)_线性表之链表_双向链表

    文章目录 大纲图 双向链表 双向链表的基本结构 双向链表的基本操作 头插 尾插 中间部位插入 删除头部 删除尾部 删除中间位置的数据 查找 更新 Code 总结 大纲图 双向链表 Algorithms ...

最新文章

  1. 如何实现流畅观影体验?视频类应用内存和CPU大调查
  2. LNMP架构php-fpm相关配置
  3. 好像最近买了很多东西
  4. [How TO]-How to Install Python Pip on Ubuntu 20.04
  5. c++ windows下读取指定目录的所有文件名字
  6. 让Terminal显示git分支
  7. 吴恩达机器学习Optional Lab - Neurons and Layers
  8. acm 程序设计大赛各种输入方式(python版)
  9. VisualEffectGraph概述
  10. jena mysql_在Jena框架下基于MySQL数据库实现本体的存取操作
  11. BUGKU------秋名山老司机
  12. hapi.js入门系列(二)——路由
  13. C#语言实例源码系列-实现Word转换TXT
  14. axure9轮播图做法与按钮思路
  15. bzoj2565manacher算法
  16. 原收件服务器地址 端口 协议,常用的收件、发件服裳组词务器的地址和端口是什么...
  17. start-all.sh启动设置ssh免密登陆还总是提示输入密码的解决办法
  18. 争议中的云算力市场 |链捕手
  19. HDU 5172 GTY's gay friends HASH随机算法
  20. 2019全球外汇三大平台排名基本情况

热门文章

  1. 【Python教程】python函数后面有多个括号的作用
  2. Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
  3. python 设置默认字典
  4. 周一 周五 记录_6.12日独家提示买入的 民丰特纸,属于突破年线的股票当天,所以我们买入后小幅盈利 于今天周一6月月15日冲高逢高获利卖出...
  5. qt creator创建cmake构建的程序,无法启动调试(点左下角运行不出结果 No executable specified.)
  6. C语言stdio.h与stdlib.h的区别
  7. pycharm 波浪线报绿 Typo: In word 'xxxx'(绿色波浪线)
  8. Intel Realsense D435 python 从深度相机realsense生成pcl点云
  9. Python根据原图解析拍摄地点
  10. win10 详细配置JAVA环境变量(最详细),操作步骤如下: