理论基础 —— 索引 —— 2-3 树
【概述】
2-3 树是一种多路查找树,其满足于以下性质:
- 每个结点都具有两个孩子或三个孩子,具有两个孩子的结点称为 2 结点,具有三个孩子的结点称为 3 结点
- 2 结点包含一个元素和两个孩子,左子树包含元素小于根结点元素,右子树包含元素大于根结点元素
- 3 结点包含一大一小两个元素和三个孩子,左子树包含较小元素,右子树包含较大元素,中间子树包含介于两者之间的元素
- 所有的叶结点都在同一层
如上图,12、48、10、15、24、31 都是 2 结点,{18,33}、{23,30}、{20,21}、{45,47}、{50,52} 都是 3 结点。
当所有的叶结点都处于同一层时,那么这棵树就是树高平衡的,可见 2-3 树是树高平衡的,其能够以相对较低的代价保持树高平衡。
此外,容易从 2-3 树的定义推出树的叶结点个数与树的深度间的关系:
- 一个高度为 k 的 2-3 树至少有 2^(k-1) 个叶结点,此时每个分支结点都有 2 个孩子,形成一棵满二叉树的形状
- 一个高度为 k 的 2-3 树最多有 3^(k-1) 个叶结点,此时每个分支结点都有 3 个孩子,形成一棵满三叉树的形状
【查找】
在 2-3 树中,查找一个关键码的过程类似于在二叉排序树中的查找。
在 2-3 树中查找给定值 k 的过程是:
- 若 root 是空树,查找失败
- 若 k=root->data,查找成功
- 对于 2 结点,若 k<root->data,在 root 的左子树进行查找;若 k>root->data,在 root 的右子树进行查找
- 对于 3 结点,若 k<root->smallData,在 root 的左子树进行查找;若 k>root->bigData,在 root 的右子树进行查找;否则,在 root 的中间子树进行查找
上述过程一直持续到 k 被找到或者待查找的子树为空,若待查找的子树为空,则查找失败。值得注意的是,当查找失败时,恰好找到了以 k 为键值的新结点在二叉排序树中的插入位置。
以下图为例,要如果查找 24,首先查找根结点,由于 24 大于 smallData=18,小于 bigData 33,那么进入中间子树,在下一层中,同样进入中间分支,到达包含 24 的叶结点。
【插入】
在 2-3 树中,插入一个关键码的过程类似于在二叉排序树中的插入,新纪录同样是插入到叶结点中。
插入过程如下:
1.对于空树,直接插入一个 2 节点
2.找到被插入记录应该插入的叶结点
3.如果应插入位置的叶结点是 2 结点,直接将新纪录插入,将 2 结点升级为 3 结点
4.如果应插入位置的叶结点是 3 结点,则需将其分裂,拆分为两个 2 结点
1)设要插入的叶结点为 L,创建一个新结点 L'
2)L 得到三个关键码中最小的一个,L' 得到三个关键码中最小的一个
3)进行一次提升:将中间的关键码与一个指向 L' 的指针传回父结点,并将被提升的关键码插入父结点
4)如果父结点为 2 结点,那么重复步骤 3
5)如果父结点为 3 结点,那么重复步骤 4 的分裂-提升过程
例如:在下图中插入 14、55
1)插入 14 时:从根结点开始查找,到达存储 15 的叶结点,其是一个 2 结点,直接将 14 插入即可
2)插入 55 时:从根结点开始查找,到达存储 {50,52} 的结点,其是一个 3 结点,需要进行分裂,加入 55 后,三个关键码的值为 50、52、55,其中,令中值 52 提升,小值 50 与大值 55 作为父结点的叶结点
【删除】
在 2-3 树中,删除一个结点与插入一个结点相反。
其过程为:
1.所删除的元素位于非叶子的分支结点时,将树按中序遍历后得到的前驱或后继元素,用其补位即可。
2.所删除的元素位于 3 结点时,在该结点删除该元素即可,不会影响整棵树的结构。
3.所删除的元素位于 2 结点时,此时分为四种情况:
1)2 结点的父结点是 3 结点:此时将 3 结点进行拆分,根据删除要删除的元素的大小,将被拆分的点与 3 结点的子树进行合并
2)2 结点的父结点是 2 结点,且拥有一个 3 结点的右孩子:将父结点与右孩子一起进行左旋,令父结点的右孩子的较小值成为新的父结点,原先的父结点成为新的左孩子,原先的右孩子的较大值不做改变
3)2 结点的父结点是 2 结点,且拥有一个 2 结点的右孩子:先在不破坏 2-3 树的性质的前提下,将 2 结点的右孩子变为 3 结点的右孩子,然后删除要删除的元素,并将剩下的三个点进行左旋调整。
4)当前树是一个满二叉树:此时删除任意一个结点都会破坏 2-3 树的性质,需要考虑在不改变 2-3 树的顺序的情况下,将 2-3 树的层次减少一层。
理论基础 —— 索引 —— 2-3 树相关推荐
- mysql 联合索 B 树_MySQL 索引与 B+ 树
MySQL 索引与 B+ 树 B+ 树 MySQL Innodb 存储引擎是使用 B+ 树来组织索引的.在介绍 B+ 树以前,先认识一下什么是 B 树,B 树是平衡二叉树,与一般的二叉查找树不同,平衡 ...
- 一文介绍 Mysql 索引模型 B+ 树
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:后端程序员必备:书写高质量SQL的30条建议个人原创+1博客:点击前往,查看更多 来源:https://segm ...
- MySQL 索引 :哈希索引、B+树索引、最左前缀匹配规则、全文索引
文章目录 索引 什么是索引 索引优缺点与适用场景 常见的索引 哈希索引 自适应哈希索引 B+树索引 聚集索引 非聚集索引 使用方法 联合索引 最左前缀匹配规则 覆盖索引 全文索引 使用方法 索引 什么 ...
- MySQL 索引 :哈希索引、B+树索引、全文索引
文章目录 索引 引言 常见的索引 哈希索引 自适应哈希索引 B+树索引 聚集索引 非聚集索引 使用方法 联合索引 最左前缀匹配规则 覆盖索引 全文索引 使用方法 索引 引言 为什么需要索引? 倘若不使 ...
- mysql索引 红黑树_为什么MySql索引使用B+树?
前言 面试中我们经常碰到面试官问到数据库索引,问到索引就会问你索引的数据结构.类似这种数据结构对于普通程序员来说记住概念几天就忘了,而且概念不是每个人都能很好都理解,所以针对这一原因,我简单通俗都像大 ...
- Mysql 索引模型 B+ 树详解
一.认识二叉树 首先,在了解 mysql 中的 B+ 树之前,我们需要搞懂什么是二叉树.二叉树是一种常见的非线形数据结构,数据是以一对多的形态组织起来的,我画了一张图来帮助你理解: 在二叉树中,有一种 ...
- MySQL之InnoDB主键索引的B+树的高度计算
文章目录 MySQL之InnoDB主键索引的B+树的高度计算 1.高度为2和3.主键bigint类型.一行记录数据大小1k MySQL之InnoDB主键索引的B+树的高度计算 1.高度为2和3.主键b ...
- mysql 二叉树表设计_Mysql 索引模型 B+ 树详解
一.认识二叉树 首先,在了解 mysql 中的 B+ 树之前,我们需要搞懂什么是二叉树.二叉树是一种常见的非线形数据结构,数据是以一对多的形态组织起来的,我画了一张图来帮助你理解: 在二叉树中,有一种 ...
- 【mysql innodb索引结构B+树】
[mysql innodb索引结构B+树] 为什么Mysql中Innodb的索引结构采取B+树? B树 B树的两个明显特点 树内的每个节点都存储数据 叶子节点之间无指针相邻 B+树 B+树的两个明显特 ...
- geotools应用-JTS生产四叉树索引和R树索引
微信搜索:"二十同学" 公众号,欢迎关注一条不一样的成长之路 geotools介绍 geotools官网https://geotools.org/ Geotools是一个java类 ...
最新文章
- 粤桂粤黔协作签约-丰收节交易会·李喜贵:谋定一县一园产业园
- Microsoft Expression Blend Preview for Silverlight 5新版发布
- 决策树模型 - (ID3算法、C4.5算法) - Python代码实现
- 关于div的定位属性问题
- Visual Studio 2015编译wxWidgets
- bat中的[%~dp0]使用
- 我的世界java版刷铁机_我的世界:教你建造新版本中最简单的刷铁机,效率高人人学的会...
- 毕向东java基础,B站直达,目录,b站浏览目录太难受,在这做一个
- 精睿ESET_VC52_UPID获取器(8.25更新4.2.2.0)
- C++实现金山打字通助手
- JavaScript的优势和劣势
- 为什么工资高的程序员很少炫富?
- 显示控件——图标类之图标旋转
- 基于树莓派+STM32+OneNET云平台打造智能家居系统(一)硬件设计篇
- 实践中 XunSearch(讯搜)的使用教程步骤
- 如何将编译好的Docker镜像推送至私有Dockerhub仓库?
- 永远不可能学会的数论之基础数论(例题)
- 泰课在线Unity3d 动作游戏全攻略——有素材和代码
- 对比学习(Contrastive Learning)的理解
- java update()方法代码_Java Datastore.update方法代码示例