2-3树、红黑树、B树

2-3树

转载https://www.cnblogs.com/yangecnu/p/Introduce-2-3-Search-Tree.html

二叉树对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。本文及后面文章介绍的平衡查找树的数据结构能够保证在最差的情况下也能达到lgN的效率,要实现这一目标我们需要保证树在插入完成之后始终保持平衡状态,这就是平衡查找树(Balanced Search Tree)。在一棵具有N 个节点的树中,我们希望该树的高度能够维持在lgN左右,这样我们就能保证只需要lgN次比较操作就可以查找到想要的值。不幸的是,每次插入元素之后维持树的平衡状态太昂贵。所以这里会介绍一些新的数据结构来保证在最坏的情况下插入和查找效率都能保证在对数的时间复杂度内完成。

2-3查找树能保证在插入元素之后能保持树的平衡状态,最坏情况下即所有的子节点都是2-node,树的高度为lgN,从而保证了最坏情况下的时间复杂度。但是2-3树实现起来比较复杂

2-3树倾向于把2节点都变为3节点,3节点先变为4节点,4节点再找一个拆分成上节点,树高度+1.

 

红黑树

转载https://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html

analysis of red black tree

优点

为什么用到了红黑树?这点要明白,学过二叉查找树的同学都知道,普通的二叉查找树在极端情况下可退化成链表,此时的增删查效率都会比较低下。为了避免这种情况,就出现了一些自平衡的查找树,比如 AVL,红黑树等。这些自平衡的查找树通过定义一些性质,将任意节点的左右子树高度差控制在规定范围内,以达到平衡状态。

红黑树是一种平衡二叉树,又叫做对称二叉B树,二叉B树是Btree和mysql索引相关的。

性质

节点是红色或黑色。
根是黑色。
所有叶子都是黑色(叶子是NIL节点)。
每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点(简称黑高)。

目前只能了解到红黑树的性质,他也是二叉树。所以查找操作也是前序后序中序,但插入和删除操作实现很难。涉及情况多,还有左旋右旋、变色等操作。

https://segmentfault.com/a/1190000012728513

B-Tree和B+Tree

这篇文章很形象的介绍了B树和B+树的优点,和插入查询操作,并且有动画

https://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html

 

这篇文章很重要,mysql索引为什么要用B树和B+树,不用红黑树。并且从数据结构的特点推导出索引的使用技巧,不用再死记硬背。

http://blog.codinglabs.org/articles/theory-of-mysql-index.html

B树一个节点能放很多数据,这些数据逻辑上相近,因为放在一个节点上物理存储位置也相近,而数据库读取用了磁盘预读原理,(当一个数据被用到时,其附近的数据也通常会马上被使用,预读的长度一般为页(page)的整倍数),每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)O(h)=O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3)。

综上所述,用B-Tree作为索引结构效率是非常高的。

而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值