JAVA拾遗 - 红黑树 Part I

来源:互联网 发布:阿里云ecs搭建淘宝客 编辑:程序博客网 时间:2024/05/16 14:11

写在最前

红黑树,应该说是我们着一些年轻程序员最害怕的玩意了,每当宿舍吹比算法的时候,聊到树,必然绕不开红黑树这个乖乖东西。

为了达到二分查找的最佳性能,我们强调生成的二分查找树必须是最“平衡”的,即所有从root点开始往下探的路径长度,总是相同的。可是总有的时候二分查找树是不会平衡的,多了一个少了一个都会影响其的平衡性。为了防止二分查找树出现最坏的情况,也为了提升查找的效率,这里提出个概念,就是所谓的平衡查找树。
不同算法的效率图以及比较方法
平衡查找树,即Balance Search Tree,虽然和Binary Search Tree缩写相同,不过其却可以完全保证自己是“平衡的”。

为什么一定是平衡的呢?这要先从红黑树的理想模型,2-3树开始讲:

2-3树

定义

2-3树就是一种由“2子节点的父节点”和“3子节点的父节点”组成的树,描述上有些抽象,可以先给大家看一幅示意图
示意图
如图上所示,包含EJ的节点就是所谓的3子节点,包含R的节点就是2子节点。

优势

也可以轻易想到,对一棵完全被充满,也就是从2-3树变成3树的树进行搜索操作时,每一次对比都会对数据进行三分,所以最后的复杂度是Log3 N,在查找操作上可以说是比二分查找的最好情况(lgN)还要好一倍。同时,这种树的最坏情况也就是一棵完整的二分查找树(所有的节点都是2子节点,也就是2树),其最坏情况也和平衡二叉树的二分查找效率一样。

图解操作

听上去很玄乎,但是这种树是怎么插入数据以保证这棵树一定是完美的平衡二叉树呢?

首先先说一个理论:
如果一棵树在经过操作前是完美平衡的、操作中也不会改变其平衡程度,那么可以说这个树在经历操作后也会是完美平衡的。

可以细看一下对于这2-3树的操作,一共有以下这几种
1 节点分离 - 1
这里写图片描述

这个操作就是在某一个点插入一个根部的3节点后形成的4节点后发生的变化,中间的那个点变成这两边两个点的root节点

2 节点分离 - 2
这里写图片描述
如果插入的位置不是根部节点,那么中间这个节点就会被“顶”到上一层,如果上一层是2节点的话,就会发生上图的行为,4节点会不断转化为两个2节点并向上输送一个节点。

3 节点分离 - 3
这里写图片描述
如果插入的位置上面是一个3节点,那么就会发生上图的情况,先把上层并成一个4节点,在按照情况继续向上输送节点。

总结

2-3树实现了一个简单高效的二分查找树的优化模型,从定义也可以知道这棵树总是一棵完美平衡二叉树,因为在插入的过程中总是不会破坏他的平衡,但是在具体实现中会遇到很多问题。对这棵树的性能分析如下

  • 最好性能:Log 3 N —–>所有的节点都是3-Node
  • 最差性能:Log 2 N —–>所有的节点都是2-Node
  • 对于百万级别的数量来说只需要进行12-20次比对
  • 对于千万级别的数量来说只需要进行18-30次比对

2-3树很美丽,但是难以实现,由其的思想我们可以制作出一种新的树状结构,也就是“红黑树”。

                    未完待续
0 0
原创粉丝点击