红黑树相关的信息

转载:https://www.cnblogs.com/wuchanming/p/4444961.html   

红黑树相关的知识点,提高自己和面试应该用的到

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

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

3.红黑树有哪些性质?

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

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

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

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

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

9 为什么一般hashtable的桶数会取一个素数

详细解答

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

红黑树

 

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

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

 

  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).确定某个结点之前有多少个结点,也就是我们要解决的问题;

 

  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).设计新的操作。

9 为什么一般hashtable的桶数会取一个素数

设有一个哈希函数
H( c ) = c % N;
当N取一个合数时,最简单的例子是取2^n,比如说取2^3=8,这时候
H( 11100(二进制) ) = H( 28 ) = 4
H( 10100(二进制) ) = H( 20 )= 4

这时候c的二进制第4位(从右向左数)就”失效”了,也就是说,无论第c的4位取什么值,都会导致H( c )的值一样.这时候c的第四位就根本不参与H( c )的运算,这样H( c )就无法完整地反映c的特性,增大了导致冲突的几率.

取其他合数时,都会不同程度的导致c的某些位”失效”,从而在一些常见应用中导致冲突.
但是取质数,基本可以保证c的每一位都参与H( c )的运算,从而在常见应用中减小冲突几率..

(个人意见:有时候不取质数效率也不会太差公司代码中的值为1<<16,但是无疑取质数之比较保险的..)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring restTemplate使用方法

https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中&#xff0c;当我们从服务消费端去调用服务提供者的服务的时候&#xff0c;使用了一个很好用的对象&#xff0c;叫做RestTemplate&#xff0c;当时我们只使用了Res…

打印菱形星号组合C程序

#include "stdio.h" #define N 9 //数组的行列数 int main(){char str[N][N]{0}; //例子,行列数应该是奇数int i,j;for(i0;i<N;i)for(j0;j<N;j)str[i][j] ;//先全部设为空格//在特定位置写入*号for(i0;i<N;i)for(j0;j<N;j){if(i0 || iN…

程序员的十层楼(11层)

第11层 上帝 看了上面的小标题&#xff0c;你可能会觉得奇怪&#xff0c;这篇文章不是讲“程序员的十层楼”吗&#xff1f;怎么冒出了第11层来了&#xff1f; 其实这并不矛盾&#xff0c;程序员确实只有十层楼&#xff0c;因为爬到第11层时&#xff0c;已经变成上帝&#xff0c…

函数局部变量和函数的参数在栈中的布局

#include <stdio.h> #include <iostream>using namespace std; void func(int p1, int p2, int p3) {int a p1;int b p2;int c p3;std::cout << "函数参数入栈顺序(栈在内存中向上伸长):从右到左" << std::endl;std::cout << &quo…

经验:Windows To Go准备工作

如果您准备使用USB设备带着您的移动Windows的话&#xff0c;您需要做好准备。从开发预览版到正式版&#xff0c;我也一直关注着Windows Go To这个新功能&#xff0c;所以&#xff0c;总结了些经验&#xff0c;分享给大家&#xff0c;希望能够帮助到大家&#xff0c;或者减少您的…

图表相同数据会自动合并问题(finereport)

finereport中&#xff0c;对于图表的操作&#xff0c;当遇到需要显示多个重复分类下的多个值时&#xff0c;由于自动合并相同数据&#xff0c;无法达到效果反复查询手册无果后&#xff0c;困扰好久&#xff0c;终想到了一个解决的办法&#xff1a;1、给查询的数据添加个列序号&…

简单的C语言程序合集

输出九九乘法表1 #include <stdio.h>2 int main()3 {4 int i,j;5 for(i1;i<9;)6 {7 for(j1;j<9;j)8 {9 if(i>j)10 {11 printf("%d*%d%d ",j,i,j*i);12 }13…

C#中读取“已注册的文件类型”的图标及读取指定文件图标的方法 (转)

usingSystem;usingSystem.IO;usingSystem.Drawing;usingMicrosoft.Win32;usingSystem.Runtime.InteropServices;namespaceGetIconDemo { ///<summary>///提供从操作系统读取图标的方法 ///</summary>publicclassGetSystemIcon { ///<summary>///依…

Redis基础知识点

Redis基础知识点&#xff1a; 1、Redis 采用的是基于内存的单进程单线程模型的 key-value 数据库。 2、默认16个数据库&#xff0c;类似数组下表从 0 开始&#xff0c;初始默认使用零号库。 select 0~15 命令用于在 0 ~ 15 号库之间进行切换 3、dbsize 命令查看当前数据库的 …

关于SQLSERVER的全文目录跟全文索引的区别

很久没有写随笔了&#xff0c;本来之前想写一篇关于SQLSERVER全文索引的随笔&#xff0c;可惜没有时间&#xff0c;一直拖到现在才有时间写&#xff0c;不好意思让各位久等了~ 先介绍一下SQLSERVER中的存储类对象&#xff0c;哈哈&#xff0c;先介绍一下概念嘛&#xff0c;让新…

安装rlwrap 的简单方法

1. 下载安装 epel包 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 2. 安装rlwrap yum install rlwrap -y 然后进入oracle 就可以 正常的上下键进行功能切换了 注意需要使用命令 rlwrap sqlplus / as sysdba 转载于:https://www.cnblogs.…

简单的C语言程序合集-2

输入一个整数n&#xff0c;求从1到n这n个整数的十进制表示中1出现的次数。&#xff08;google面试题&#xff09; #include <stdio.h>int main(){int n, N, count 0;printf("plesae input a number: ");scanf("%d",&N);for(n1;n<N; n){ in…

在Delphi中如何创建和使用udl文件

如何在Delphi中创建和使用udl文件&#xff1a;方法一&#xff1a;直接弹出UDL对话框:use ADOConed; EditConnectionString(ADOQuery1);方法二&#xff1a;⑴、右键---新建---文本文档&#xff0c;重命名为 connSet.udl 。⑵、双击打开 connSet.udl 按提示操作配置数据库&#x…

redis事务的简单介绍

所谓事务应具有以下特效&#xff1a;原子性(Atomicity)&#xff0c; 一致性(Consistency)&#xff0c;隔离性(Isolation)&#xff0c;持久性(Durability)&#xff0c;简称ACID&#xff0c;但redis所提供的事务比较简单&#xff0c;它通过MULTI、EXEC、DISCARD和WATCH等命令实现…

Android Zip文件解压缩代码

在Android平台中如何实现Zip文件的解压缩功能呢? 因为Android内部已经集成了zlib库&#xff0c;对于英文和非密码的Zip文件解压缩还是比较简单的&#xff0c;下面Android123给大家一个解压缩zip的java代码&#xff0c;可以在Android上任何版本中使用&#xff0c;Unzip这个静态…

C语言指针(1)嵌入式linux

计算机中所有的数据都必须放在内存中&#xff0c;不同类型的数据占用的字节数不一样&#xff0c;例如 int占用4个字节&#xff0c;char 占用1个字节。为了正确地访问这些数据&#xff0c;必须为每个字节都编上号码&#xff0c;就像门牌号、身份证号一样&#xff0c;每个字节的编…

最全android Demo

1、BeautifulRefreshLayout-漂亮的美食下拉刷新https://github.com/android-cjj/BeautifulRefreshLayout/tree/BeautifulRefreshForFood2、Material Design-动画风格的选项卡tab切换功能https://github.com/neokree/MaterialTabs3、TwinklingRefreshLayout-支持下拉刷新和上拉加…

网站优化之Ajax优化及相关工具

web2.0大量的ajax的使用&#xff0c;提高了ui交互的效率&#xff0c;但是过度的滥用会带来不少的问题。 ajax使用注意事项&#xff1a; 1 尽量避免使用同步ajax调用。在一些登录的场合常常使用同步调用服务器的登录接口。 同步调用&#xff0c;需要将页面上的所有元素给锁定住&…

MessageQueue Message Looper Handler的解释说明

总结4个关键概念 1、MessageQueue&#xff1a;是一种数据结构&#xff0c;见名知义&#xff0c;就是一个消息队列&#xff0c;存放消息的地方。每一个线程最多只可以拥有一个MessageQueue数据结构。 创建一个线程的时候&#xff0c;并不会自动创建其MessageQueue。通常使用一个…

C语言中的内存分配

在任何程序设计环境及语言中&#xff0c;内存管理都十分重要。在目前的计算机系统或嵌入式系统中&#xff0c;内存资源仍然是有限的。因此在程序设计中&#xff0c;有效地管理内存资源是程序员首先考虑的问题。 第1节主要介绍内存管理基本概念&#xff0c;重点介绍C程序中内存的…