版权所有,转载请注明出处,谢谢!
http://blog.csdn.net/silangquan/article/details/18655795

连续两次面试都问到了红黑树,关键两次都没有答好,这次就完整地来学习整理一下。

没有学习过红黑树的同学请参考:

<<Introduction to Algorithms>> Chapter 13 Red-Black Trees Chapter 14 Augmenting Data Structures

教你透彻了解红黑树

1.stl中的set底层用的什么数据结构?

2.红黑树的数据结构怎么定义的?

3.红黑树有哪些性质?

4.红黑树的各种操作的时间复杂度是多少?

5.红黑树相比于BST和AVL树有什么优点?

6.红黑树相对于哈希表,在选择使用的时候有什么依据?

7.如何扩展红黑树来获得比某个结点小的元素有多少个?

8.扩展数据结构有什么步骤?

详细解答

1.stl中的set底层用的什么数据结构?

红黑树

2.红黑树的数据结构怎么定义?

enum Color
{RED = 0,BLACK = 1
};struct RBTreeNode
{struct RBTreeNode*left, *right, *parent;int   key;int data;Color color;
};

3.红黑树有哪些性质?

一般的,红黑树,满足以下性质,即只有满足以下全部性质的树,我们才称之为红黑树:
1)每个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每个叶结点(叶结点即指树尾端NIL指针或NULL结点)是黑的。
4)如果一个结点是红的,那么它的俩个儿子都是黑的。
5)对于任一结点而言,其到叶结点树尾端NIL指针的每一条路径都包含相同数目的黑结点。

4.红黑树的各种操作的时间复杂度是多少?

能保证在最坏情况下,基本的动态几何操作的时间均为O(lgn)

5.红黑树相比于BST和AVL树有什么优点?

红黑树是牺牲了严格的高度平衡的优越条件为代价,它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。

相比于BST,因为红黑树可以能确保树的最长路径不大于两倍的最短路径的长度,所以可以看出它的查找效果是有最低保证的。在最坏的情况下也可以保证O(logN)的,这是要好于二叉查找树的。因为二叉查找树最坏情况可以让查找达到O(N)。

红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高,所以在插入和删除中所做的后期维护操作肯定会比红黑树要耗时好多,但是他们的查找效率都是O(logN),所以红黑树应用还是高于AVL树的. 实际上插入 AVL 树和红黑树的速度取决于你所插入的数据.如果你的数据分布较好,则比较宜于采用 AVL树(例如随机产生系列数),但是如果你想处理比较杂乱的情况,则红黑树是比较快的

6.红黑树相对于哈希表,在选择使用的时候有什么依据?

权衡三个因素: 查找速度, 数据量, 内存使用,可扩展性。
  总体来说,hash查找速度会比map快,而且查找速度基本和数据量大小无关,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n) 小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash。但若你对内存使用特别严格, 希望程序尽可能少消耗内存,那么一定要小心,hash可能会让你陷入尴尬,特别是当你的hash对象特别多时,你就更无法控制了,而且 hash的构造速度较慢。

红黑树并不适应所有应用树的领域。如果数据基本上是静态的,那么让他们待在他们能够插入,并且不影响平衡的地方会具有更好的性能。如果数据完全是静态的,例如,做一个哈希表,性能可能会更好一些。

在实际的系统中,例如,需要使用动态规则的防火墙系统,使用红黑树而不是散列表被实践证明具有更好的伸缩性。Linux内核在管理vm_area_struct时就是采用了红黑树来维护内存块的。

红黑树通过扩展节点域可以在不改变时间复杂度的情况下得到结点的秩。

7.如何扩展红黑树来获得比某个结点小的元素有多少个?

这其实就是求节点元素的顺序统计量,当然任意的顺序统计量都可以需要在O(lgn)时间内确定。

在每个节点添加一个size域,表示以结点 x 为根的子树的结点树的大小,则有

size[x] = size[[left[x]] + size [right[x]] + 1;

这时候红黑树就变成了一棵顺序统计树。

利用size域可以做两件事:

1). 找到树中第i小的结点;

OS-SELECT(x;,i)
r = size[left[x]] + 1;
if i == rreturn x
elseif i < rreturn OS-SELECT(left[x], i)
else return OS-SELECT(right[x],  i)

思路:size[left[x]]表示在对x为根的子树进行中序遍历时排在x之前的个数,递归调用的深度不会超过O(lgn);

2).确定某个结点之前有多少个结点,也就是我们要解决的问题;

OS-RANK(T,x)
r = x.left.size + 1;
y = x;
while y != T.rootif y == y.p.rightr = r + y.p.left.size +1y = y.p
return r

思路:x的秩可以视为在对树的中序遍历种,排在x之前的结点个数加上一。最坏情况下,OS-RANK运行时间与树高成正比,所以为O (lgn).

8.扩展数据结构有什么步骤?

1).选择基础数据结构;

2).确定要在基础数据结构种添加哪些信息;

3).验证可用基础数据结构上的基本修改操作来维护这些新添加的信息;

4).设计新的操作。

剑指XX游戏(六) - 轻松搞定面试中的红黑树问题相关推荐

  1. 面试题——轻松搞定面试中的红黑树问题

    版权所有,转载请注明出处,谢谢! http://blog.csdn.net/silangquan/article/details/18655795 连续两次面试都问到了红黑树,关键两次都没有答好,这次 ...

  2. 轻松搞定面试中的红黑树问题

     连续两次面试都问到了红黑树,关键两次都没有答好,这次就完整地来学习整理一下. 没有学习过红黑树的同学请参考: <<Introduction to Algorithms>> ...

  3. 轻松搞定面试中的二叉树题目

    版权全部,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/7518888 树是一种比較重要的数据结构,尤其是二叉树.二 ...

  4. 剑指XX游戏(七) - 不拼搏,枉少年

    不拼搏,枉少年 网易游戏2014年实习生招聘. 过程:无电面,笔试半小时,两道算法题,面试一小时. 结果:7进2,扑街. 这是我最接近网易游戏的一次. 下面大部分的内容是没有答上来的. 1.算法题:W ...

  5. 轻松搞定面试中的链表题目

    版权所有,转载请注明出处,谢谢! http://blog.csdn.net/walkinginthewind/article/details/7393134 链表是最基本的数据结构,面试官也常常用链表 ...

  6. 一文搞定面试中的二叉树问题

    一文搞定面试中的二叉树问题 版权所有,转载请注明出处,谢谢! http://blog.csdn.net/walkinginthewind/article/details/7518888 树是一种比较重 ...

  7. java面试手写单链表_(转)面试大总结之一:Java搞定面试中的链表题目

    packageLinkedListSummary; importjava.util.HashMap; importjava.util.Stack; /** * http://blog.csdn.net ...

  8. 九十六、轻松搞定Python中的PPT办公自动化系列

    @Author:Runsen @Date:2020/7/14 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  9. 熟练掌握skynet,后端开发丨游戏开发轻松搞定丨多线程丨多进程

    掌握skynet,后端开发原来如此简单 1. 多线程 2. 多进程 3. actor模型-skynet 4. csp模型 [技术分享篇]熟练掌握skynet,后端开发丨游戏开发轻松搞定丨多线程丨多进程 ...

最新文章

  1. 神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火
  2. Java 两线程交替打印奇偶数(一)
  3. idea 配置jdk版本_JDK 11 安装过程(同时已安装了JDK 8)以及Intellij IDEA 配置
  4. centos7 源码安装goaccess
  5. 天籁obd接口针脚定义_典藏 | OBD接口位置大全及部分常用手机型号语音播报设置流程...
  6. hdu1247 Hat’s Words
  7. 一份超详细的VTD安装指南(内容含如何安装ubuntu系统及如何在ubuntu中安装显卡驱动)
  8. C语言程序设计教材九斗验证,C语言实验报告参考答案(原)
  9. 黑客技术思维导图总结
  10. PS基础全讲和使用技巧(二)
  11. 2D姿势估计论文合集
  12. 行业知识图谱调查报告(一):知识图谱概述
  13. 基于canvas图像处理的图片 灰色图像
  14. 1周上线系统,效率提升100%,宜搭助力阿里巴巴法务数字化升级
  15. 突然间思考PID 有意思的地方-为什么说开环控制最优这句话也对也不对
  16. SpringCloud禁用Eureka自我保护模式
  17. qq安装路径无效Linux,QQ提示安装路径无效您没有权限的两种解决办法
  18. Python判断某个列表是否是另一个列表的子列表
  19. 如何使用python将中文标点转为英文标点?
  20. Linux fsck命令详解

热门文章

  1. 什么牌子的护眼灯最好推荐?盘点口碑好的护眼灯品牌
  2. 计算机键盘鼠标价格,价格相差5倍 看普通鼠标和游戏鼠标有何不同
  3. Dota英雄卡尔有多少个技能?
  4. 完整版 html代码简洁说明,【完整版-HTML代码简介说明-适合新手】讲述.ppt
  5. 日语学习的一些网站推荐
  6. 规则引擎系列—初识规则引擎
  7. java中的12的意思_在外壳中,“ 2&1”是什么意思?
  8. C语言简单编程题——9*9乘法表
  9. linux加载的驱动无法卸载,linux驱动加载后不能再卸载
  10. 2015年15+最佳的响应式HTML5网站模板