1. 红黑树(Red-Black Trees)
参考《算法导论》P308页,红黑树是一种对树的高度要求最灵活的准平衡二叉搜索树。五大属性:
1: Every node is either RED or BLACK.
2: The root is black.
3: Every leaf(NIL) is black. (The NIL is the sentinel.)
4: If a node is RED, then both its children areblack.
5: For each node, all paths from the node todescendant leaves contain the same number of black nodes. (Excluding the nodeitself.)
我的顺口溜:有红有黑,根叶皆黑,父红子黑,简单路径,黑点相同。
黑高(black-height):从某个节点出发(不包括该节点)到达一个叶子节点的任意一条简单路径上的黑色节点数为黑高,即bh(x)。
红黑树的操作都涉及到了旋转操作,较为复杂,可参考书籍。两点注意:
插入、删除、搜索操作的复杂度都是lgn,插入最多两次旋转操作,删除最多三次旋转操作。
红黑树的典型应用是关联数组,linux内核中的用户态地址空间管理使用了红黑树。另外,java中的TreeSet类的底层也是红黑树来实现的。
2. AVL树
AVL的来源是它的三个发明者的名字中各取一个字母,是最早发明的自平衡BST,也被称为高度平衡树。特点:
1:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
AVL树的操作都涉及到了旋转操作,较为复杂,可参考书籍。插入、删除、搜索操作的复杂度都是lgn,任何不平衡都会在三次旋转之内解决。
根据http://blog.csdn.net/jiangfuqiang/article/details/8448651描述,windows的进程地址空间的管理用的是AVL树。
3. B-Tree
《算法导论》中对B-Tree的定义如下:
1)每个结点x有一下域:
a)n[x],当前存储在结点x中的关键字数
b)n[x]个关键字本身,以升序存放,因此key(1)[x]<=key(2)[x]<=...<=key(n[x])[x],
c)leaf[x],是一个布尔值,如果x是叶子的话为TRUE,else,为FALSE
2)每个内结点x还包含n[x]+1个指向其子女的指针c1[x],c2[x],...,c(n[x]+1)[x]。叶结点没有子女,故她们的ci域无定义。
3)各关键字keyi[x]对存储在各子树中的关键字范围加以分隔:如果ki为存储在以ci[x]为根的子树中的关键字则
k1<=key1[x]<=k2<=key2[x]<=...<=key(n)[x]<=k(n[x]+1)
4)每个叶结点具有相同的慎独,即树的高度h。
5)每个结点能包含的关键字书有一个上界和一个下届。这些界可用一个称作B树的最小度数的固定整数t>=2来表示。
a)每个非根的结点必须至少有t-1个关键字。每个非根内结点至少有t个子女。如果树是非空的,则跟结点至少包含一个关键字。
b)每个结点可包含至多2t-1个关键字。所以一个内结点至多可有2t个子女。我们说一个结点是满的,如果它恰好有2t-1个关键字。
t=2时B树是最简单的。这时每个内结点有2个,3个或4个子女,亦即一棵2-3-4树。
在实际中通常采用大得多的t值。
B-Tree的典型应用是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树。B-Tree与红黑树类似,但在降低磁盘I/O操作次数方面要更好一些。很多数据库使用B-Tree或它的变体。
4. 红黑树、AVL树、B-Tree应用场景
B-Tree:管理大量条目并且需要将他们从磁盘或者其他低速存储器换页到内存中。
这里贴一段维基百科上的比较:
Both AVL trees and red-black trees areself-balancing binary search trees and they are very similar mathematically. Theoperations to balance the trees are different, but both occur on the average inO(1) with maximum in O(log n).
The real difference between the two is the limitingheight. For a tree of size n :
· An AVL tree‘s height isstrictly less than:
where is the golden ratio.
· A red-blacktree‘s height is at most
AVL trees are more rigidly balanced than red-black trees,leading to slower
insertion and removal but faster retrieval.
也就是说节点数相同时候,由于AVL树时严格平衡的,它比红黑树高度要小。另一方面,因为旋转操作更频繁,它比红黑树插入删除要慢,但是查询速度更快。一句话,“AVL is faster to search, Red-Black faster toinsert”.
更多的关于AVL树和红黑树的讨论:http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&ixPost=22948。