多路查找树(2-3 树、2-3-4 树、B 树、B+ 树)
本文参考自《大话数据结构》
计算机中数据的存储
一般而言,我们都是在内存中处理数据,但假如我们要操作的数据集非常大,内存无法处理了,在这种情况下对数据的处理需要不断地从硬盘等存储设备中调入或调出内存页面。
对外存设备的读写,效率并不乐观。为了降低对外存设备的访问次数,我们需要新的数据结构来处理这个问题。之前学习过的树,一个结点可以有多个孩子,但它自身只能存储一个元素。二叉树限制更多,只有两个孩子结点。在元素非常多时,要么树的度非常大(结点拥有子树的个数的最大值),要么树的高度非常大,如果我们要查找某一元素,必须多次访问外存设备,这迫使我们要打破每一个结点只能存储一个元素的限制,引入多路查找树的概念。
多路查找树,其每一个结点的孩子数可以多于两个,且一个结点可以存储多个元素。由于它是查找树,所有元素之间存在某种特定的排序关系。
2-3 树和 2-3-4 树
2-3 树是拥有以下性质的多路查找树:
每一个结点都具有两个孩子(称为 2 结点)获三个孩子(称为 3 孩子)
一个 2 结点包含一个元素和两个孩子(或没有孩子),左子树包含的元素小于该元素,右子树包含的元素大于该元素
一个 3 结点包含一大一小两个元素和三个孩子(或没有孩子),左子树包含的元素小于较小元素,右子树包含的元素大于较大元素,中间子树包含介于两个元素之间的元素
2-3 树中所有的叶子结点都在同一层次上
对于 2-3 树,查找某一元素的方法与二叉排序树一样。要判断一个元素是否存在,我们先将待查找元素和根节点比较,如果它和其中任意一个相等,那查找命中;否则根据比较的结果来选择查找的方向。
要对 2-3 树插入元素,如果是一颗空树,直接创建一个 2 结点即可,如果不是空树,则要考虑以下情况:
插入结点到一个 2 结点,可直接将 2 结点转换为 3 结点
插入结点到一个 3 结点,其父结点为 2 结点
如果命中查找结束于 3 结点,先临时将其成为 4 结点,把待插入元素添加到其中,然后将 4 结点转化为 3 个 2 结点,中间的结点成为左右结点的父结点,并与父结点为合并。
插入结点到一个 3 结点,其父结点为 3 结点
插入元素后一直向上分解临时的 4 节点,直到遇到 2 节点的父节点变成 3 节点不再分解为止。如果达到树根节点还是 4 节点,则分解根节点,此时树高加一(只有分解根节点才会增加树高)。
对于 2-3 树的删除,如果对前面插入的理解到位的话,就不是难事了。相比于插入,删除的情况较多,如果逐一介绍就太浪费时间了,总的来说它是有规律的。
2-3-4 树其实就是 2-3 树的概念扩展,它多了一个 4 结点。一个 4 结点包含小中大三个元素和四个孩子(或没有孩子),左子树包含小于最小元素的元素;第二子树包含大于最小元素,小于第二元素的元素;第三子树包含大于第二元素,小于最大元素的元素;右子树包含大于最大元素的元素。
B 树和 B+ 树
B 树是一种平衡的多路查找树,2-3 树和 2-3-4 树都是 B 树的特例,结点所拥有的最大孩子树称为 B 树的阶,因此,2-3 树是 3 阶 B 树,2-3-4 树是 4 阶 B 树。
一个 m 阶的 B 树具有如下属性:
- 如果根结点不是叶结点,则至少有两颗子树
- 每一个非根的分支结点都有 k-1 个元素和 k 个孩子
- 所有叶子结点都处于同一层次
- 值位于 k-1 和 k 之间的子结点,都位于 k-1 和 k 对应的 value 之间
B 树的插入和删除和 2-3 树或 2-3-4 树是类似的,只不过阶数可能会很大而已。B 树可以帮助我们减少内存与外存之间数据的频繁交换,假设一颗 B 树的阶是 1001,高度为 2,它可以存储超过 10 亿个关键字。我们只要让根结点持久保留在内存中,那么寻找一个关键字至多只需要两次硬盘的读取。而如果使用二叉树,那就不得了了,光是树的高度就不知道比使用 B 大到哪里去,对硬盘的读取次数自然也多得多。
B 树还是有缺陷的,如果我们要遍历一颗 B 树,必须往返于每个结点之间,也就意味着得多次访问硬盘,有没有可能让遍历时每个元素只访问一次呢?我们在原有的 B 树结构基础上,加上新的元素组织形式,这就是 B+ 树。
B+ 树与 B 树的差异在于:
- B+ 树的分支结点不保存关键字,只进行数据索引,结点中仅含有其子树中的最大(或最小)关键字
- B+ 树所有的叶子结点包含全部关键字信息,及指向含这些关键字记录的指针,叶子结点本身依关键字的大小从小到大顺序链接
B+ 所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同,查询效率也比 B 树稳定。B+ 树也结点遍历速度更快,因为只需要从最左侧的叶子结点出发,一直沿着指向下一叶子结点的指针遍历即可。另外,B+ 树天然具备排序功能,因此特别适合带有范围的查找。
多路查找树(2-3 树、2-3-4 树、B 树、B+ 树)的更多相关文章
- 【查找结构5】多路查找树/B~树/B+树
在前面专题中讲的BST.AVL.RBT都是典型的二叉查找树结构,其查找的时间复杂度与树高相关.那么降低树高自然对查找效率是有所帮助的.另外还有一个比较实际的问题:就是大量数据存储中,实现查询这样一个实 ...
- 多路查找树之2-3-4树和B树 - 数据结构和算法82
多路查找树之2-3-4树和B树 让编程改变世界 Change the world by program 由2-3树到2-3-4树 ...... 省略,具体请看视频讲解 ...... B树 一个m阶的B ...
- 数据结构(六)查找---多路查找树(B树)
B 树 B树与B+树 一:定义 B树(B-树)是一种平衡的多路查找树.-3树和2--4树都是B树的特例.节点最大的孩子数组称为B树的阶(order),因此,-3树是3阶B树,--4树是4阶B树. 二: ...
- 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树
1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...
- HTTP协议漫谈 C#实现图(Graph) C#实现二叉查找树 浅谈进程同步和互斥的概念 C#实现平衡多路查找树(B树)
HTTP协议漫谈 简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲 ...
- 数据结构(四十一)多路查找树(B树)
一.多路查找树的背景 前面所讨论的查找算法都是在内存中进行的,它们适用于较小的文件,而对于较大的.存放在外存储器上的文件就不合适了,对于此类大规模的文件,即使是采用了平衡二叉树,在查找效率上仍然较低. ...
- 二叉查找树、平衡二叉树(AVLTree)、平衡多路查找树(B-Tree),B+树
B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引. B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的. 在 ...
- Java数据结构(十五)—— 多路查找树
多路查找树 二叉树和B树 二叉树的问题分析 二叉树操作效率高 二叉树需要加载到内存,若二叉树的节点多存在如下问题: 问题1:构建二叉树时,需多次进行I/O操作,对与速度有影响 问题2:节点海量造成二叉 ...
- 数据结构和算法学习笔记十五:多路查找树(B树)
一.概念 1.多路查找树(multi-way search tree):所谓多路,即是指每个节点中存储的数据可以是多个,每个节点的子节点数也可以多于两个.使用多路查找树的意义在于有效降低树的深度,从而 ...
随机推荐
- Kubernetes-5:搭建企业级私有仓库Harbor
搭建企业级私有仓库Harbor 安装需求 python版本 >= 2.7 Docker引擎版本 >= 1.10 docker-compose版本 >= 1.6.0 安装环境 一.Py ...
- delphi DBgrid应用全书
在一个Dbgrid中显示多数据库 在数据库编程中,不必要也不可能将应用程序操作的所有数据库字段放入一个数据库文件中.正确的数据库结构应是:将数据库字段放入多个数据库文件,相关的数据库都包含一个唯 ...
- 一起来读官方文档-----SpringIOC(03)
1.4.依存关系 典型的企业应用程序不坑你只包含单个对象或单个bean.即使是最简单的应用程序,也有一些对象可以协同工作,以呈现最终用户视为一致的应用程序.下一部分将说明如何从定义多个独立的Bean定 ...
- App网络测试
弱网测试作为健壮性测试的重要部分,对于移动端测试必不可少. 什么样的网络属于弱网? 小于或等于2G速率的都属于弱网,且随着5G的到来,3G网络速率的降低,未来3G也会逐渐划入弱网的行列. 对于弱网的数 ...
- 第3课 - 启航Lua之路
第3课 - 启航Lua之路 1. Lua中的变量 (1)变量:全局变量和局部变量 — Lua中支持全局变量和局部变量的概念 全局变量:直接定义变量名,并复制 a = 1; -- 用 ; 结束当前语 ...
- 使用vscode编辑和提交github仓库代码
写在前面 在github上想删除仓库中的某个文件或文件夹,亦或是重命名操作都很麻烦,这里提供一种vscode的解决方案.在vscode中克隆远程github仓库,然后对代码或文件进行编辑,最后提交即可 ...
- 分布式系统监视zabbix讲解四之可视化
图形 概述 随着大量的监控数据被采集到Zabbix中,如果用户可以以可视化的表现形式来查看发生了什么事情,那么和仅仅只有数字的表现形式比起来则更加轻松. 以下是进行图形设置的地方.图形可以一目了然地掌 ...
- 首发!Alibaba内部:Spring源码培训课件笔记曝光!
本文包含的内容 Spring占有的市场 阅读源码的重要性 阅读源码困难度 课件笔记的主要内容 Spring占有的市场 先来简单说一下现在各个企业常用并与Spring相关的: ssh = spring ...
- spring boot之支持http和https并行(http不跳转)
首先需要去做个证书 yml配置文件中设置的是https监听端口 server: port: 10007 tomcat: basedir: /data/apps/temp #配置SSL ssl: key ...
- 面向对象技术-原文转载自jingwhale
面向对象技术 --原文转载自jingwhale,文章底部附原文链接 对象是面向对象的程序设计的核心,它由描述状态的属性(变量)和用来实现对象行为的方法(函数)组成,完成了从数据模型到处理模型的结合与统 ...