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

这篇具有很好参考价值的文章主要介绍了剑指XX游戏(六) - 轻松搞定面试中的红黑树问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文地址 http://blog.csdn.net/silangquan/article/details/18655795?utm_source=tuicool&utm_medium=referral

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

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

<<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.红黑树的数据结构怎么定义?

[cpp] view plain
  1. enum Color  
  2. {  
  3.           RED = 0,  
  4.           BLACK = 1  
  5. };  
  6.   
  7. struct RBTreeNode  
  8. {  
  9.            struct RBTreeNode*left, *right, *parent;  
  10.            int   key;  
  11.            int data;  
  12.            Color color;  
  13. };  

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小的结点;

[cpp] view plain
  1. OS-SELECT(x;,i)  
  2. r = size[left[x]] + 1;  
  3. if i == r  
  4.      return x  
  5. elseif i < r  
  6.      return OS-SELECT(left[x], i)  
  7. else return OS-SELECT(right[x],  i)  

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

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

[cpp] view plain
  1. OS-RANK(T,x)  
  2. r = x.left.size + 1;  
  3. y = x;  
  4. while y != T.root  
  5.          if y == y.p.right  
  6.                  r = r + y.p.left.size +1  
  7.          y = y.p  
  8. return r  


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

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

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

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

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

4).设计新的操作。文章来源地址https://www.toymoban.com/news/detail-711253.html

到了这里,关于剑指XX游戏(六) - 轻松搞定面试中的红黑树问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 史上最详细的红黑树讲解(一篇文章教你手撕红黑树)

           🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️小林爱敲代码       🛰️博客专栏:✈️数据结构与算法       🛰️欢迎关注:👍点赞🙌收藏✍️留言       今天给大家讲解红黑树,和AVL树一样,这章暂且不讲删除。

    2024年01月16日
    浏览(32)
  • 《剑指 Offer》专项突破版 - 面试题 15 : 字符串中的所有变位词(C++ 实现)

    题目链接 :LCR 015. 找到字符串中所有字母异位词 - 力扣(LeetCode) 题目 : 输入字符串 s1 和 s2,如何找出字符串 s2 的所有变位词在字符串 s1 中的起始下标?假设两个字符串中只包含英文小写字母。例如,字符串 s1 为 \\\"cbadabacg\\\",字符串 s2 为 \\\"abc\\\",字符串 s2 的两个变位词 \\\"c

    2024年01月18日
    浏览(42)
  • Nginx 轻松搞定跨域问题

    当你遇到跨域问题,不要立刻就选择复制去尝试。请详细看完这篇文章再处理 。我相信它能帮到你。 分析前准备: 前端网站地址:http://localhost:8080 服务端网址:http://localhost:59200 首先保证服务端是没有处理跨域的,其次,先用postman测试服务端接口是正常的 当网站8080去访问

    2024年02月11日
    浏览(25)
  • 轻松搞定Docker环境下Redis安装

    目录 一、docker安装redis  二、准备redis.conf配置文件 三、创建本地redis.conf文件,用以映射   四、将原配置好的redis.conf文件内容复制到本地redis.conf  五、挂载配置,启动docker redis  六、连接redis  七、一些命令补充 # 该处下载的是redis 5.0,如果想下载最新可以去掉“:5”,默

    2024年02月07日
    浏览(30)
  • C++并发操作解密:轻松搞定数据同步

      概述: 在C++中,通过互斥锁解决并发数据同步问题。定义共享数据和互斥锁,编写线程函数,使用互斥锁确保操作的原子性。主函数中创建并启动线程,保障线程安全。实例源代码演示了简单而有效的同步机制。 在C++中解决并发操作时的数据同步问题通常需要使用互斥锁

    2024年02月04日
    浏览(27)
  • 夸克AI写作神器,轻松搞定各种文章

    夸克AI写作文笔细腻优美,作为人工智能写作工具的代表,能满足用户对于测评对比风格的需求。接下来,我会从多个方面深入浅出地介绍并评价此产品。 1.界面简洁直观 夸克AI的写作界面设计简洁明了,用户能轻易地上手使用。左方为编辑区,右方为预览区,便捷性极强。

    2024年03月13日
    浏览(74)
  • 在飞书上轻松集成ChatGPT,3步搞定!

    为了让用户更便捷地使用 ChatGPT,我们将 ChatGPT 集成到飞书,设置只需要几分钟。 步骤一:获取飞书 Webhook URL 在应用商店或点击飞书官网下载飞书。下载安装后进入飞书界面,点击上方 ➕号 创建一个群组。 输入群名称,例如: ChatGPT , 并点击 创建 按钮。在新建的群组界面

    2024年02月07日
    浏览(61)
  • 轻松入门数字图像处理,搞定OpenCV编程!

    在刚开始学习数字图像处理时,你是否也有这样的困扰: 教材的开篇介绍绪论和数学工具,看得似懂非懂,似乎还不涉及编程…… 接下来学习灰度变换、空间滤波和频域滤波,涉及内容丰富、方法繁多,试着编了几个程序就编不下去了…… 开始学习OpenCV,找了几本参考书,

    2024年02月09日
    浏览(38)
  • Postman实战:轻松搞定接口自动化测试

    随着移动互联网的发展,接口自动化测试已经成为软件测试领域中不可或缺的一部分。而作为最流行的API开发工具之一,Postman凭借其简单易用、功能强大的特点赢得了越来越多开发者和测试人员的青睐。 想要掌握Postman的接口自动化测试技能,只需要花费少量时间学习即可轻

    2024年02月15日
    浏览(40)
  • 如何使用MindStudio轻松搞定大模型全流程开发

    本文分享自华为云社区《【如何使用MindStudio轻松搞定大模型全流程开发》,作者: 华为云社区精选。 大模型的规模和能力在迅猛发展,更大的参数、更长的序列及更多的模态是未来大模型技术的发展趋势。更大的规模的模型意味着更大规模的算力平台,算力设备的部件与任

    2024年01月19日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包