版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/m0_37609579/article/details/99699390

一、2-3-4树的定义
2-3-4树就是一种4阶的多叉树,它像红黑树一样是平衡树,可以保证在O(lgn)的时间内完成查找、插入和删除操作,容易实现,但是效率比红黑树稍差。
2-3-4树每个节点最多有四个字节点和三个数据项,名字中 2,3,4 的数字含义是指一个节点可能含有的子节点的个数。对于非叶节点有三种可能的情况:

  1. 有一个数据项的节点总是有两个子节点;
  2. 有二个数据项的节点总是有三个子节点;
  3. 有三个数据项的节点总是有四个子节点。

简而言之,非叶节点的子节点数总是比它含有的数据项多1。如果子节点个数为L,数据项个数为D,那么:L = D + 1。

二、操作
构建一个数组为{7,1,2,5,6,9,8,4,3}的2-3-4树的过程:
2-3-4树的插入:

2-3-4树的删除:

三、效率
分析2-3-4树我们可以和红黑树作比较分析。红-黑树的层数(平衡二叉树)大约是log2(N+1),而2-3-4树每个节点可以最多有4个数据项,如果节点都是满的,那么高度和log4N。因此在所有节点都满的情况下,2-3-4树的高度大致是红-黑树的一半。不过他们不可能都是满的,所以2-3-4树的高度大致在log2(N+1)和log2(N+1)/2。减少2-3-4树的高度可以使它的查找时间比红-黑树的短一些。
但是另一方面,每个节点要查看的数据项就多了,这会增加查找时间。因为节点中用线性搜索来查看数据项,使得查找时间的倍数和M成正比,即每个节点数据项的平均数量。总的查找时间和M*log4N成正比。
四、2-3树
2-3树是一棵自平衡的多路查找树,它并不是一棵二叉树,具有如下性质:

  1. 每个节点有1个或2个key,对应的子节点为2个子节点或3个子节点;
  2. 所有叶子节点到根节点的长度一致;
  3. 每个节点的key从左到右保持了从小到大的顺序,两个key之间的子树中所有的key一定大于它的父节点的左key,小于父节点的右key。

2-3-4树只是在2-3树的基础上进行了扩展,任一节点只能是1个或2个或3个key,对应的子节点为2个子节点或3个子节点或4个子节点。
五、2-3-4树跟红黑树的转化
Java HashMap的红黑树是普通的红黑树,既可以左旋也可以右旋的。红黑树从根到叶子节点的最长路径不会超过最短路径的二倍。红黑树是黑色平衡的,即从根节点到所有叶子节点的路径,经过的黑色的节点数是相等的。 本质上来说,红黑树这个数据结构的基本思想源自于阶数为4的B树(也就是2-3-4树)。

等同于

2-3-4 树是红黑树的一种等同,这意味着它们是等价的数据结构。换句话说,对于每个 2-3-4 树,都存在着至少一个数据元素是相同次序的红黑树。在 2-3-4 树上的插入和删除操作也等价于在红黑树中的颜色翻转和旋转。这使得它成为理解红黑树背后的逻辑的重要工具。
因此对于红黑树的插入等操作,可以类比4阶B树的相关操作。
1. 要将一个节点A插入,首先要将该节点的key值与树中的节点Key值相比较,最后找到一个正确的null节点位置,然后替换此null节点。此时节点A的颜色为红色。
2. if A节点父节点为黑色,那么插入过程结束,因为红色的节点不会影响红黑树的平衡if A节点父节点为红色,那么此时要看A节点的父节点的兄弟节点,也就是A节点的叔叔节点:
if A节点没有叔叔节点,则进行红黑树的旋转操作(左旋或右旋),最后的情况是,A节点的爷爷节点的位置由A节点的父节点替换了,A节点原来的爷爷节点在旋转后成为了A节点的父节点的子节点,也就是A节点的爷爷节点成为了A节点的兄弟节点。注意,旋转的过程中,不光A节点的父节点与爷爷节点的位置要变换,两个节点的颜色也要变:

插入14 →

a
if A节点有叔叔节点(可知A节点的叔叔节点颜色应该与A节点的父节点相同,即为红色) 则将A节点的父节点和叔叔节点颜色全部置为黑色,而将A节点的爷爷节点的颜色置为红色,以保证整个红黑树仍然是黑色平衡的。 此时A节点的爷爷节点为红色,可能会导致不再满足红黑树的约束,因此要对变成红色的爷爷节点进行与插入A节点时相同的操作,来维持整个红黑树的平衡,这个过程可能是一个递归的过程。

插入9 →

六、总结
2-3树和2-3-4树都是多路查找树。每一个结点的孩子数可以多于两个,且每一个结点处可以存储多个元素。由于它是查找树,所有元素之间存在某种特定的排序关系。
2-3-4 树是红黑树的一种等同,这意味着它们是等价的数据结构。


我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考资料:

  1. https://blog.csdn.net/qy844083265/article/details/80716065
  2. https://www.cnblogs.com/ysocean/p/8032648.html
  3. https://blog.csdn.net/yishizuofei/article/details/81660841
  4. https://blog.csdn.net/MustangJy/article/details/87783323

树复制替换id_程序员的进阶课-架构师之路(12)-2-3-4树相关推荐

  1. 程序员的进阶课-架构师之路(14)-B+树、B*树

    一.有了B树,为啥还有B+.B*树? B+树 B+树是B-树的变体,也是一种多路搜索树: 其定义基本与B-树同,除了: 非叶子结点的子树指针与关键字个数相同: 非叶子结点的子树指针P[i],指向关键字 ...

  2. 程序员的进阶课-架构师之路(7)-树的概念

    接下来我们将会介绍另外一种数据结构--树.二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构.那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序 ...

  3. 程序员的进阶课-架构师之路(15)-那些年你遇到的其他树

    除了前文介绍的树之外,我们再来看看另外一些比较特别的树. 一.R树 R树在数据库等领域做出的功绩是非常显著的.它很好的解决了在高维空间搜索等问题.举个R树在现实领域中能够解决的例子:查找20英里以内所 ...

  4. 程序员的进阶课-架构师之路(10)-霍夫曼树

    一.霍夫曼(Huffman)的由来 1.历史上的远距通信问题 最初的远距通信用于传递文本信息,主要是电报. 小A:如何将一段文字内容为"BADCADFEED"通过网络传递给别人呢? ...

  5. 程序员的进阶课-架构师之路(17)-堆

    我们来介绍另外一种数据结构-堆,注意这里的堆和我们Java语言,C++语言等编程语言在内存中的"堆"是不一样的,这里的堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都为O ...

  6. 程序员的进阶课-架构师之路(12)-2-3-4树

    一.2-3-4树的定义 2-3-4树就是一种4阶的多叉树,它像红黑树一样是平衡树,可以保证在O(lgn)的时间内完成查找.插入和删除操作,容易实现,但是效率比红黑树稍差. 2-3-4树每个节点最多有四 ...

  7. 程序员的进阶课-架构师之路(9)-平衡二叉树(AVL树)

    一.平衡二叉树的定义 对一棵查找树(search tree)进行查询/新增/删除 等动作, 所花的时间与树的高度h 成比例, 并不与树的容量 n 成比例.如果可以让树维持矮矮胖胖的好身材, 也就是让h ...

  8. 二叉树为空意味着二叉树_程序员的进阶课-架构师之路(8)-二叉树

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  9. 根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

最新文章

  1. golang string切片解析json
  2. 计算机网络及公文写作知识,计算机网络期末复习题
  3. ELK 构建 MySQL 慢日志收集平台详解
  4. 2021-08-20 python安装及作图
  5. HTML5语义元素的使用
  6. 【5分钟 Paper】Continuous Control With Deep Reinforcement Learning
  7. Python学习之字典详解
  8. Unity_Demo | 中世纪风3D-RPG游戏
  9. 【ACL2020】结果已出,录用论文抢先看!
  10. linux查看进程的代码,Linux ps 查看进程(示例代码)
  11. Scala中名词的解释
  12. 阿里云轻量应用型服务器防火墙端口开放了还是无法访问问题@林
  13. linux文本三剑客演讲稿,Linux文本三剑客总结
  14. 摄像头 SONY VISCA 协议
  15. 2014522420145238 《信息安全系统设计基础》第二次实验
  16. 日语中那些表示复数概念的表达方式
  17. oracle sql查询字段中以“;”分割的字符串,转化成对应的,以“;”分割的文字串
  18. ITPUB名人堂第二期
  19. Tableau:如何对任意两个时间段的数据进行对比
  20. Matlab实现图像识别(五)

热门文章

  1. 人脸识别方法个人见解
  2. [CODEVS 3044] 矩形面积求并
  3. Fast R-CNN《Fast R-CNN》论文笔记
  4. uvalive5986(贪心)
  5. 2017年11月01日普及组 I Will Like Matrix!
  6. 部落卫队pascal解题程序
  7. Codeforces 1326F Wise Men (容斥原理、状压 DP、子集和变换、划分数)
  8. python pandas 读取excel 去重某一列_Python中Pandas读取修改excel操作攻略(代码示例)...
  9. 软件开发规范和标准_社交APP,社交直播软件开发怎样才可靠了?
  10. python四大数据类型_Python 四大数据类型总结