数据结构(8)树形结构——B树、B+树(含完整建树过程)

简介: 8.1.B树8.1.1.概述B树存在的意义:二叉树在存储数据时可能出现向一边倾斜导致查询效率降低的情况,为了防止二叉树的倾斜,出现了平衡二叉树,通过旋转的方式保证二叉树的平衡。但是就算是保持绝对的平衡,在面对要存储的数量量级够大的时候也会出现树的高度整体偏高的问题,树的高度过高,即使是使用了二分查找,依然会出现查找效率变低的情况。尤其是磁盘查找数据本身是个机械完成的动作,这一动作本身就十分耗时。因此需要一种能进行二分查找缩短查找时间,能存储大量数据后树高也不会过高的树形结构,这就是B树。

8.1.B树

8.1.1.概述

B树存在的意义:

二叉树在存储数据时可能出现向一边倾斜导致查询效率降低的情况,为了防止二叉树的倾斜,出现了平衡二叉树,通过旋转的方式保证二叉树的平衡。但是就算是保持绝对的平衡,在面对要存储的数量量级够大的时候也会出现树的高度整体偏高的问题,树的高度过高,即使是使用了二分查找,依然会出现查找效率变低的情况。尤其是磁盘查找数据本身是个机械完成的动作,这一动作本身就十分耗时。因此需要一种能进行二分查找缩短查找时间,能存储大量数据后树高也不会过高的树形结构,这就是B树。

B树的概念:

B树又称为多路平衡查找树,满足以下规则

基本结构

每个结点可以存放多个数据,每个结点的数据实体处理存放数据外有左右指针指向自己的子结点,也就是说当前结点存放n个数据的话,它最多能有n-1个指针指向自己的子结点。

B树的阶数

阶数,代表单个节点最多有多少个查找路径,也就是单结点的指针数量,当阶数=2时,这棵B树就是二叉树。

排序方式

单结点内部按照升序排列。结点之间,左结点<根结点<右结点

子结点数

非叶节点的子节点数>1,且<=M ,且M>=2,空树除外

单结点的数据存放上限

大于等于ceil(阶数/2)-1个且小于等于阶数-1个,ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2。

以下展示一个B树的示例,省略号表示为了节约作图空间没画出来但是存在的结点:

003edd0b0f7e41c689e3f871ea91d0ca.png

B树的缺点:

不适合范围查找,例如我们要查找上面这棵B树里>5的数据,那么要在找到15后还要继续查找30右边的指针,40右边的指针......可以看到需要进行很繁复的遍历。

8.1.2.完整建树过程

3、8、31、11、23、29、50、28  构建一个5阶B树。

5阶B树,因此每个节点有4个关键字,5个分支。

940e7e7f869e451987ad97cedce89d5c.png

8.2.B+树

因为B树对范围查询效果不好,于是出现了对于范围查询有较好支持的B+树。

B+树其实就是专门为了更好的支持范围查询,微调了一下B树的结构。

思路:

  • 每个分支的叶子结点上挂载这路分支上的所有数据。
  • 这样可以保证树的最后一层上有整棵树的所有数据,并且在叶子结点层级上会呈现出数据均匀分块的效果。
  • 将叶子结点用双向指针连起来(图中有误)。
  • 这样进行范围查找的时候直接走到叶子结点层,然后在沿着指针查找即可。优化了B树的范围查找能力。

a5eb054b53e2485db3e302fc63b72bbc.png

可以看到B树和B+树各有优缺:

存放同样的数据,B树的内存开销要低于B+树,因为B+树在叶结点挂了路径上的所有数据,相当于把数据存了两份。但是B+树的范围查询效率更好。

目录
相关文章
|
1月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
86 64
|
3天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
33 16
|
25天前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
16 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(三)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(二)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
1月前
|
存储
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(一)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
23天前
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
23 0
|
2月前
|
JSON 前端开发 JavaScript
一文了解树在前端中的应用,掌握数据结构中树的生命线
该文章详细介绍了树这一数据结构在前端开发中的应用,包括树的基本概念、遍历方法(如深度优先遍历、广度优先遍历)以及二叉树的先序、中序、后序遍历,并通过实例代码展示了如何在JavaScript中实现这些遍历算法。此外,文章还探讨了树结构在处理JSON数据时的应用场景。
一文了解树在前端中的应用,掌握数据结构中树的生命线