【面经笔记】红黑树的特性与其在C++ STL中的应用
2017-07-11 22:08
316 查看
AVL树和红黑树适合内部存储应用,B树适合外部存储应用
AVL树和红黑树都是用旋转保持平衡,AVL树对每个插入操作最多需要两次次旋转(单/双旋),对每个删除操作最多需要O(logn)次旋转;而红黑树对每个插入和删除操作,任何不平衡都会在三次旋转之内解决。
查找、插入、删除的时间均为log(n),红黑树的算法时间复杂度和AVL相同,但红黑树的统计性能要好于平衡二叉树,但极端性能略差。
左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1
树的深度即log(n)。查找、插入、删除的时间均为log(n)。
将二叉树节点的平衡因子BF定义为该节点的左子树的深度减去它的右子树的深度
距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,称为最小不平衡子树。
插入新节点,平衡操作:
最小不平衡子树的BF与它的子树的BF符号相同时:
最小不平衡子树根结点的平衡因子大于1时,右旋
最小不平衡子树根结点的平衡因子小于-1时,左旋
最小不平衡子树的BF与它的子树的BF符号相反时:
先对子树结点进行一次旋转是的符号相同,再反向旋转一次才能完成平衡操作。
删除结点:
删除一个结点q后,从根结点到q的路径上的一些结点或者全部结点的平衡因子都改变了,删除操作最多需要O(logn)次旋转
性质1. 节点是红色或黑色
性质2. 根是黑色
性质3. 所有叶子都是黑色(叶子是Null节点)
性质4. 如果一个节点是红的,则它的两个儿子都是黑的
性质5. 从任一节点到其叶子的所有简单路径都包含相同数目的黑色节点。
这五个性质强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。为什么呢?性质4暗示着任何一个简单路径上不能有两个毗连的红色节点,这样,最短的可能路径全是黑色节点,最长的可能路径有交替的红色和黑色节点。同时根据性质5知道:所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。
规则5要求新增结点为红结点,规则4要求新节点的父节点为黑色,当新节点到达插入点,却未能符合上述5个条件,需要调整颜色并旋转树形。
红黑树并不是平衡二叉树,恰恰相反,红黑树放松了平衡二叉树的某些要求,由于一定限度的“不平衡”,红黑树的性能得到了提升。
查找、插入、删除的时间均为log(n),统计性能要好
4000
于平衡二叉树,但极端性能略差。
STL中set、multiset、map、multimap底层是红黑树实现的,而unordered_map、unordered_set 底层是哈希表实现的。
multiset、multimap: 插入相同的key的时候,我们将后插入的key放在相等的key的右边,之后不管怎么进行插入或删除操作,后加入的key始终被认为比之前的大。
AVL树和红黑树都是用旋转保持平衡,AVL树对每个插入操作最多需要两次次旋转(单/双旋),对每个删除操作最多需要O(logn)次旋转;而红黑树对每个插入和删除操作,任何不平衡都会在三次旋转之内解决。
查找、插入、删除的时间均为log(n),红黑树的算法时间复杂度和AVL相同,但红黑树的统计性能要好于平衡二叉树,但极端性能略差。
平衡二叉树/AVL树:
[b]定义:[/b]左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1
树的深度即log(n)。查找、插入、删除的时间均为log(n)。
将二叉树节点的平衡因子BF定义为该节点的左子树的深度减去它的右子树的深度
距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,称为最小不平衡子树。
插入新节点,平衡操作:
最小不平衡子树的BF与它的子树的BF符号相同时:
最小不平衡子树根结点的平衡因子大于1时,右旋
最小不平衡子树根结点的平衡因子小于-1时,左旋
最小不平衡子树的BF与它的子树的BF符号相反时:
先对子树结点进行一次旋转是的符号相同,再反向旋转一次才能完成平衡操作。
删除结点:
删除一个结点q后,从根结点到q的路径上的一些结点或者全部结点的平衡因子都改变了,删除操作最多需要O(logn)次旋转
红黑树:
满足下列条件的二叉搜索树是红黑树性质1. 节点是红色或黑色
性质2. 根是黑色
性质3. 所有叶子都是黑色(叶子是Null节点)
性质4. 如果一个节点是红的,则它的两个儿子都是黑的
性质5. 从任一节点到其叶子的所有简单路径都包含相同数目的黑色节点。
这五个性质强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。为什么呢?性质4暗示着任何一个简单路径上不能有两个毗连的红色节点,这样,最短的可能路径全是黑色节点,最长的可能路径有交替的红色和黑色节点。同时根据性质5知道:所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。
规则5要求新增结点为红结点,规则4要求新节点的父节点为黑色,当新节点到达插入点,却未能符合上述5个条件,需要调整颜色并旋转树形。
红黑树并不是平衡二叉树,恰恰相反,红黑树放松了平衡二叉树的某些要求,由于一定限度的“不平衡”,红黑树的性能得到了提升。
查找、插入、删除的时间均为log(n),统计性能要好
4000
于平衡二叉树,但极端性能略差。
STL中set、multiset、map、multimap底层是红黑树实现的,而unordered_map、unordered_set 底层是哈希表实现的。
multiset、multimap: 插入相同的key的时候,我们将后插入的key放在相等的key的右边,之后不管怎么进行插入或删除操作,后加入的key始终被认为比之前的大。
相关文章推荐
- php学习笔记------[php中面向对象三大特性之一[封装性]的应用]
- php学习笔记 php中面向对象三大特性之一[封装性]的应用
- 【SQL2005 ReportingService特性与应用】笔记
- php学习笔记------[php中面向对象三大特性之一[继承性]的应用]
- 红黑树的特性及其应用
- javaEE学习笔记【01】集成环境开发应用、JDK新特性
- php学习笔记------[php中面向对象三大特性之一[继承性]的应用]
- php学习笔记------[php中面向对象三大特性之一[封装性]的应用]
- php学习笔记------[php中面向对象三大特性之一[继承性]的应用]
- php学习笔记 php中面向对象三大特性之一[封装性]的应用
- php学习笔记------[php中面向对象三大特性之一[封装性]的应用]
- ADO.NET的数据提供程序和数据连接——ADO.NET学习&应用笔记之二
- “UML应用实作细节”(by Think, UMLChina)复习笔记(4)——通过用例组织需求
- “UML应用实作细节”(by Think, UMLChina)复习笔记(1)——由来
- 移动数据库应用特性的研究
- 为你的j2ee应用增加AOP 特性
- 今天开始在这里写学习Python、应用Python的学习笔记
- 小蠢笔记:从继承特性来看构造函数
- “UML应用实作细节”(by Think, UMLChina)复习笔记(2)——总则