【算法导论学习-26】 二叉树专题4:红黑树、AVL树、B-Tree

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

时间: 2024-10-12 08:41:24

【算法导论学习-26】 二叉树专题4:红黑树、AVL树、B-Tree的相关文章

算法导论学习笔记——第13章 红黑树

红黑树 红黑树是一种二叉查找树,但在每个结点上增加一个存储位存储结点的颜色,可以是red或black.通过对任意一条从根到叶的路径上结点颜色的限制,红黑树确保没有任何一条路径比其他路径长出两倍,因而是接近平衡的. 每个结点包含5个域,color,key,left,right,p 满足以下红黑性质: 1.每个结点是红色或黑色 2.根结点是黑色 3.每个叶结点(nil)是黑色 4.如果一个结点是红色,那么它的两个子结点都是黑色 5.对每个结点,从该结点到它每个子孙结点的路径上,黑结点数目相同 左旋转

算法导论读书笔记(15) - 红黑树的具体实现

算法导论读书笔记(15) - 红黑树的具体实现 目录 红黑树的简单Java实现 红黑树的简单Java实现 /** * 红黑树 * * 部分代码参考自TreeMap源码 */ public class RedBlackTree<T> { protected TreeNode<T> root = null; private final Comparator<? super T> comparator; private int size = 0; private static

算法导论 第三部分——基本数据结构——红黑树

红黑树 红黑树是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色,可以是RED或者BLACK.通过对任何一条从根到叶子的路径上各个着色方式的限制, 红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的.当二叉查找树的高度较低时,这些操作执行的比较快,但是当树的高度较高时,这些操作的性能可能 不比用链表好.红黑树(red-black tree)是一种平衡的二叉查找树,它能保证在最坏情况下,基本的动态操作集合运行时间为O(lgn). 1.红黑树的性质 #define RED 0

【算法导论】第13章,红黑树

红黑树是一种"平衡的"查找树,能确定动态集合操作时间为O(logn) 13.1 红黑树的性质 红黑树的每个节点除了 key, value, p, left, right之外,还有color, 有value的都视为内节点,如果没有儿子,认为儿子都是NIL, 红黑性质:1.每个节点要么红要么黑 2.根节点黑 3.叶子节点(NIL)黑 4.如果节点为红,那么儿子为黑 5.从任意节点出发,下面任意一条路径,黑节点个数都相同. 机智处理 NIL节点指向同一个位置,其value为NIL,p, le

伸展树&amp;红黑树&amp;AVL树总结

最近学习了这3种树,感觉其实有很多相同的地方吧,首先是最重要的旋转操作,3种树都有 AvlTree left_left(AvlTree k1) { //if(height(k1->left)-height(k1->right)<2)return k1; AvlTree k2 = k1->left; k1->left = k2->right; k2->right = k1; k1->Height = max(height(k1->left),height

算法导论学习---红黑树具体解释之插入(C语言实现)

前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜索树,它通过在每一个结点附加颜色位和路径上的一些约束条件能够保证在最坏的情况下基本动态集合操作的时间复杂度为O(nlgn).以下会总结红黑树的性质,然后分析红黑树的插入操作,并给出一份完整代码. 先给出红黑树的结点定义: #define RED 1 #define BLACK 0 ///红黑树结点定义,与普通

算法导论学习---红黑树详解之插入(C语言实现)

前面我们学习二叉搜索树的时候发现在一些情况下其高度不是很均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜索树,它通过在每个结点附加颜色位和路径上的一些约束条件可以保证在最坏的情况下基本动态集合操作的时间复杂度为O(nlgn).下面会总结红黑树的性质,然后分析红黑树的插入操作,并给出一份完整代码. 先给出红黑树的结点定义: #define RED 1 #define BLACK 0 ///红黑树结点定义,与普通的二

算法导论 学习资源

学习的过程会遇到些问题,发现了一些比较好的资源,每章都会看下别人写的总结,自己太懒了,先记录下别人写的吧,呵呵. 1  Tanky Woo的,每次差不多都看他的 <算法导论>学习总结 - 1.前言 <算法导论>学习总结 - 2.第一章 && 第二章 && 第三章 <算法导论>学习总结 - 3.第四章 && 第五章 <算法导论>学习总结 - 4.第六章(1) 堆排序 <算法导论>学习总结 - 5.第六

【算法导论学习-015】数组中选择第i小元素(Selection in expected linear time)

1.算法思想 问题描述:从数组array中找出第i小的元素(要求array中没有重复元素的情况),这是个经典的"线性时间选择(Selection in expected linear time)"问题. 思路:算法导论215页9.2 Selection in expect linear time 2.java实现 思路:算法导论216页伪代码 /*期望为线性时间的选择算法,输入要求,array中没有重复的元素*/ public static int randomizedSelect(i