前言
正文
1.3.1.1 定义及优势
1.3.1.1.1 定义
1.3.1.1.2 优势
2-3树的查找效率与树的高度是息息相关的。
- 在最坏的情况下,也就是所有的节点都是2-node节点,查找效率为lgN
- 在最好的情况下,所有的节点都是3-node节点,查找效率为log3N约等于0.631lgN
- 1百万个节点的2-3树,树的高度为12-20之间,对于10亿个节点的2-3树,树的高度为18-30之间。
1.3.1.1.3 为什么要这样排列?
因为它是balanced的!一棵高度为k的2-3 tree有2k – 1 到 3k – 1 之间的叶;一棵有elements 为n的2-3 tree 高度最小为 1+log3n, 最大为 1+log2n。它的检索时间为O(logn)。
伪代码如下:
LOOP until curr = nil
IF ( data = curr.small OR data = curr.large )
Return curr
ELSE IF ( data < curr.small )
curr = curr.left
ELSE IF ( data > curr.small AND data < curr.large )
curr = curr.middle
ELSE
curr = curr.large
1.3.1.2 查找
2-3树的查找和二叉查找树类似,要确定一个树是否属于2-3树,我们首先和其跟节点进行比较,如果相等,则查找成功;否则根据比较的条件,在其左中右子树中递归查找,如果找到的节点为空,则未找到,否则返回。
- 二叉树按照升序插入10个key会得到高度为9的一棵最差树,2-3Tree的高度为2.
- 含有10亿个结点的一棵2-3树的高度仅在19-30之间。(也就是说,访问最多30个结点可查)
1.3.1.2.1 插入
对于2-3 tree,所有的插入(新值)都必须发生在leaf。所以,首先找到新值应该所在的leaf,然后根据这个leaf的情况做出判断:
1. 该点只有一个元素。直接加入就可以了,判断是small还是large。
2. 该点full(small和large都有值),其父结点不是full。那就split该结点,并把中间值推上去。
3. 该点和其父结点都full。如果父结点full,表示父结点已经有3个子树。那就需要一直split 并一直往上推,直到发生以下情况:
1) 父结点最多只有3个子树
2) 父结点是根,创建一个新root,保存中间值。树的高度增加1
1.3.1.2.2 往一个2-node节点插入
往2-3树中插入元素和往二叉查找树中插入元素一样,首先要进行查找,然后将节点挂到未找到的节点上。2-3树之所以能够保证在最差的情况下的效率的原因在于其插入之后仍然能够保持平衡状态。如果查找后未找到的节点是一个2-node节点,那么很容易,我们只需要将新的元素放到这个2-node节点里面使其变成一个3-node节点即可。但是如果查找的节点结束于一个3-node节点,那么可能有点麻烦。
1.3.1.2.3 往一个3-node节点插入
往一个3-node节点插入一个新的节点可能会遇到很多种不同的情况,下面首先从一个最简单的只包含一个3-node节点的树开始讨论。- 新建插入,临时将新键存入该节点中,使之成为4-结点。
- 3-key 4-link,为了容易转化为一棵由3个2-node组成的2-3 Tree
1.3.1.2.4 向节点是3-node,父节点是2-node中插入新键
- 新建插入,临时将新键存入该节点中,使之成为4-结点。
- 3-key 4-link,为了容易转化为一棵由3个2-node组成的2-3 Tree
- 将上述的父节点(3.1.2.2中分解出的父节点)与其真正的父节点(2-node)合并。
1.3.1.2.5 节点是3-node,父节点也是3-node
1.3.1.2.6 分解根节点
1.3.1.2.5 汇总
1.3.1.2.5.1 局部变换
1.3.1.2.5.2 全局性质
1.3.1.2.5.3 2-3树的实现
1.3.1.3 一些扩展
- Gross, R. Hernández, J. C. Lázaro, R. Dormido, S. Ros (2001). Estructura de Datos y Algoritmos. Prentice Hall. ISBN 84-205-2980-X.
- Aho, Alfred V.; Hopcroft, John E.; Ullman, Jeffrey D. (1974). The Design and Analysis of Computer Algorithms. Addison-Wesley., p.145-147