做者:小傅哥
博客:https://bugstack.cnhtml
沉淀、分享、成长,让本身和他人都能有所收获!😄
讲道理5年开发,没用过数据结构,你只是在作CRUD!
程序员
不少时候大部分程序员👨💻头疼于,查询慢、效率低、一堆的关联SQL,主要缘由是在程序设计上没有作出很好的数据结构。固然也还有一部分是因为老业务代码,或者没有用到一些大数据服务等。面试
数据结构、算法、设计模式,是每个程序员成长过程当中的内功心法修炼,而你的新技能用的再绚、多线程使的再六、加锁玩的再牛🐂,也只能说明你这我的身体好,但身体好是不能抗住子弹的。只有身体+心法都好,都能纵横捭阖。算法
这一章节是结合HashMap
的延展,在Jdk1.8中HashMap是使用桶数组+链表和红黑树
实现,因此顺着上一章节的核心原理和API功能讲解后,原本这一章节想直接进入到红黑树,但若是想把红黑树学明白,就须要了解他的前因后果,也就是它的前身2-3树
🌲。数据库
谢飞机,考你几个简单的知识点🦀设计模式
🤥飞机,回去等消息吧!数组
平常的学习和一部分伙伴的面试中,居然会听👂到的是;从HashMap中文红黑树、从数据库索引为B+Tree,但问2-3树的状况就不是不少了。数据结构
从最根本的缘由来看,使用树结构就是为了提高总体的效率;插入、删除、查找(索引),尤为是索引操做。由于相比于链表,一个平衡树的索引时间复杂度是O(logn),而数组的索引时间复杂度是O(n)。多线程
从如下的图上能够对比,二者的索引耗时状况;函数
在树的数据结构中,最早有点是二叉查找树,也就是英文缩写BST树。在使用数据插入的过程当中,理想状况下它是一个平衡的二叉树,但实际上可能会出现二叉树都一边倒,让二叉树像列表同样的数据结构。从而树形结构的时间复杂度也从O(logn)
升级到O(n)
,以下图;
综上呢,若是咱们但愿在插入数据后又保持树的特色,O(logn)的索引性能,那么就须要在插入时进行节点的调整
2-3树是什么结构,它怎么解决平衡问题的。带着问题咱们继续🤔。
2-3树是一种很是巧妙的结构,在保持树结构的基础上,它容许在一个节点中能够有两个元素,等元素数量等于3个时候再进行调整。经过这种方式呢,来保证整个二叉搜索树的平衡性。
这样说可能尚未感受,来看下图;
2-3树已经能够解决平衡问题那么,数据是怎么存放和调整的呢,接下来咱们开始分析。
2-3树,读法;二三树,特性以下;
序号 | 描述 | 示意图 |
---|---|---|
1 | 2-,1个数据节点2个树杈 | ![]() |
2 | 3-,2个数据节点3个树杈 | ![]() |
3 | 三叉与两叉的不一样点在于,除了两边的节点,中间件还有一个节点。这个节点是介于二、4之间的值。 | ![]() |
4 | 当随着插入数据,会出现临时的一个节点中,有三个元素。这时会被调整成一个二叉树。 | ![]() |
综上咱们能够总结出,2-3树的一些性质;
接下来咱们就模拟在二叉搜索树中退化成链表的数据,插入到2-3树的变化过程,数据包括;一、二、三、四、五、六、7
,插入过程图以下;
以上,就是整个数据在插入过程当中,2-3树的演化过程,接下来咱们具体讲解每一步的变化;
三、四、5
共用1个节点,当一个节点上有三个数据时候,则须要进行调整。5 6
共用。此时是一个临时存放,须要调整。初步调整后,抽出6节点,向上存放,变为2 4 6
共用一个节点,这是一个临时状态,还须要继续调整。二、四、6
,则继续须要把中间节点上移,一、3
和五、7
则分别成二叉落到节点2
、节点6
上。🇬🇷希腊字母:α(阿尔法)、 β(贝塔)、γ(伽马)、δ(德尔塔)、ε(伊普西隆)、ζ(截塔)、η(艾塔)、θ(西塔)、ι(约塔)
有了上面数据插入的学习,在看数据删除其实就是一个逆向的过程,在删除的主要包括这样两种状况;
承接上面👆的例子,咱们把数据再从七、六、五、四、三、二、1
顺序删除,观察2-3树的结构变化,以下;
五、6
合并,但此时破坏了2-3树的平衡性,须要缩短树高进行调整。二、4
合并,节点一、3
分别插入左侧和中间。再看一个稍微复杂点2-3树删除:
上面👆这张图,就一个稍微复杂点的2-3平衡树,树的删除过程主要包括;
三、5
合并,指向节点2,保持树平衡。八、9
合并。15
上移,恢复成3-叉树。🤔若是有时候很差理解删除,能够试想下,这个要删除的节点,在插入的时候是一个什么效果。
相比于插入和删除,索引的过程仍是比较简单的,不须要调整数据结果。基本原则就是;
🔍第一层寻找:
🔍第二层寻找:
🔍第三次寻找: