红黑树

Java面经合集:CMS+红黑树+线程状态+事务隔离+中间件

二次信任 提交于 2019-11-29 08:18:34
马上进入求职招聘高峰,总结了一份BAT(阿里、百度等)资深Java相关的面试题合集给到大家,希望在接下来的面试求职中会对大家有所帮助。 文末有相关的2019最新BAT资深java面试题答案~用于参考 JVM JVM内存模型结构 JVM的垃圾回收算法? JVM有哪些GC,各自的区别? 方法区和直接内存什么时候会oom? JVM收集器G1的内存模型和CMS的内存模型有什么不同? jvm调优用过吗? 如何查看java内存使用情况(jconsole、命令jmap、jstack等等) 集合 Arraylist、linkedlist差异,应用场景; HashMap在JDK1.8有哪些改动? HashCurrentMap和HashMap的区别在哪里? Hashmap什么时候使用红黑树? 多线程 线程的几种状态,请画出具体的状态流转图? Java wait、sleep的区别? volatile如何实现指令重排序? 线程池中的阻塞队列如果满了怎么办(拒绝策略)? Synchronized和AQS异同,AQS公平非公平如何实现; 多线程里面对一个整型做加减为啥不能用volatile; voliatile和synchonized有什么区别?synchonized和jdk提供的Lock包又有什么区别? 算法 二叉树宽度遍历 红黑树 数据结构的话,链表,树,图的基本知识得懂 了解树的先序遍历,中序遍历

epoll详细工作原理

拥有回忆 提交于 2019-11-29 08:06:34
开发高性能网络程序时,windows开发者们言必称iocp,linux开发者们则言必称epoll。大家都明白epoll是一种IO多路复用技术,可以非常高效的处理数以百万计的socket句柄,比起以前的select和poll效率高大发了。我们用起epoll来都感觉挺爽,确实快,那么,它到底为什么可以高速处理这么多并发连接呢? 先简单回顾下如何使用C库封装的3个epoll系统调用吧。 [cpp] view plain copy int epoll_create( int size); int epoll_ctl( int epfd, int op, int fd, struct epoll_event *event); int epoll_wait( int epfd, struct epoll_event *events, int maxevents, int timeout); 使用起来很清晰,首先要调用epoll_create建立一个epoll对象。参数size是内核保证能够正确处理的最大句柄数,多于这个最大数时内核可不保证效果。 epoll_ctl可以操作上面建立的epoll,例如,将刚建立的socket加入到epoll中让其监控,或者把 epoll正在监控的某个socket句柄移出epoll,不再监控它等等。 epoll_wait在调用时,在给定的timeout时间内

红黑树原理及平衡二叉树旋转详解_一点课堂(多岸学院)

孤者浪人 提交于 2019-11-29 06:03:14
红黑树 树的介绍 树具有的特点有: (1)每个结点有零个或多个子结点 (2)没有父节点的结点称为根节点 (3)每一个非根结点有且只有一个父节点 (4)除了根结点外,每个子结点可以分为多个不相交的子树 名词理解: 结点:指树中的一个元素; 结点的度:指结点拥有的子树的个数,二叉树的度不大于2; 叶子:度为0的结点,也称为终端结点; 高度:叶子节点的高度为1,根节点高度最高; 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点 子节点:子节点是父节点的下一层节点。 - 节点的层次:从根节点开始,根节点为第一层,根的子节点为第二层,以此类推 - 兄弟节点:拥有共同父节点的节点互称为兄弟节点 度 树的深度(Depth)或高度是树中结点的最大层次。 二叉树 二叉树是每个结点最多有两个子树的树结构。 它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。 为什么需要平衡二叉树? 为了避免这种情况的发生,我们希望可以有一种算法,将我们的不平衡的二叉排序树转化为平衡二叉排序树。这样就可以让我们的二叉排序树结构最优化。 平衡因子 该节点左子树的高度-该节点右子树的高度,既左右子树高度之差。 平衡二叉树旋转 LL型 LR型 RR型 一次旋转调整 RL型 第一次旋转,RR型 第二旋转,RR型进行调整 情况一 添加新节点3 按照LL型,进行一次右旋调整 情况二

红黑树(自平衡的二叉查找树)

放肆的年华 提交于 2019-11-29 04:54:48
30张图带你彻底理解红黑树 红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理? 红黑树定义和性质 红黑树是一种 含有红黑结点并能自平衡的二叉查找树 。它必须满足下面性质: 性质1:每个节点要么是黑色,要么是红色。 性质2: 根节点 是 黑色 。 性质3:每个 叶子节点 (NIL)是 黑色 。 性质4:每个 红色结点的两个子结点 一定都是 黑色 。 性质5: 任意一结点到每个叶子结点 的路径都 包含数量相同的黑结点 。 性质5.1:如果 一个结点存在黑子结点 ,那么 该结点肯定有两个子结点 (在Java中, 叶子结点 是 为null 的结点。) 图1就是一颗简单的红黑树。其中Nil为叶子结点,并且它是黑色的。(值得提醒注意的是,在Java中,叶子结点是为null的结点。) 红黑树并 不是 一个 完美平衡(左右子树高度相差为0)二叉查找树 ,从图1可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的 黑结点的层数是相等的 ,也即 任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点 (性质5)。所以我们叫红黑树这种平衡为 黑色完美平衡 。 我们把 正在处理(遍历)的结点 叫做 当前结点 ,如图2中的D,它的父亲叫做父结点,它的父亲的另外一个子结点叫做兄弟结点,父亲的父亲叫做祖父结点。 红黑树自平衡 红黑树能自平衡,它靠的是什么?三种操作: 左旋

HashMap原理

余生颓废 提交于 2019-11-29 03:58:12
HashMap: 1.存储结构: JDK1.7 HashMap底层存储结构是散列表,即数组(散列桶Map.Entry[]) + 单向链表. JDK8 HashMap底层存储结构是散列表,即数组(散列桶Node[]) + 单向链表 + 红黑树(TreeNode) 加入红黑树的原因: HashMap存储元素时,如果元素Hash值发生碰撞的次数很多的时候,链表节点增多,查询效率越来越低 所以JDK8中,当链表中节点数量达到8个,即使用红黑树结构替换链表,当红黑树节点数量少于6个时,则更换为链表,加个中间值7是为了防止频繁切换数据结构 2.存取原理(1.7) key==null 存取都是在数组的第一个元素 key!=null 存:根据key的hashCode计算出在位桶中的位置,然后遍历链表中的节点,有相同的则替换value,没有则新增到链表头部(JDK1.7是头部,1.8是尾部) 取:根据key的hashCode计算出在位桶中的位置,然后遍历链表中的节点,当hashCode相同且key相同则返回 3.扩容机制 当添加元素时,元素数量>=加载因子*容量 且 元素数量不超过Integer.Max_value时 ,即扩容为原size*2 新建数组并将原数组中的数据复制到新数组. 来源: http://www.cnblogs.com/jia-bei/p/8472994.html

HashMap 原理解析

半城伤御伤魂 提交于 2019-11-29 03:57:58
HashMap是由数组加链表的结合体。如下图: 图中可以看出HashMap底层就是一个数组结构,每个数组中又存储着链表(链表的引用) JDK1.6实现hashmap的方式是采用位桶(数组)+链表的方式,即散列链表方式。JDK1.8则是采用位桶+链表/红黑树的方式,即当某个位桶的链表长度达到某个阈值(8)的时候,这个链表就转化成红黑树,这样大大减少了查找时间。 存储查找原理: 存储:首先获取key的hashcode,然后取模数组的长度,这样可以快速定位到要存储到数组中的坐标,然后判断数组中是否存储元素,如果没有存储则,新构建Node节点,把Node节点存储到数组中,如果有元素,则迭代链表(红黑二叉树),如果存在此key,默认更新value,不存在则把新构建的Node存储到链表的尾部。 查找:同上,获取key的hashcode,通过hashcode取模数组的长度,获取要定位元素的坐标,然后迭代链表,进行每一个元素的key的equals对比,如果相同则返回该元素。 HashMap在相同元素个数时,数组的长度越大,则Hash的碰撞率越低,则读取的效率就越高,数组长度越小,则碰撞率高,读取速度就越慢。典型的空间换时间的例子。 下面我们分析HashMap的源码: HashMap的结构属性: public class HashMap<K,V> extends AbstractMap<K,V>

红黑树

扶醉桌前 提交于 2019-11-29 03:31:38
性质 红黑树是满足下列性质的二叉树: 树中只有红色的节点和黑色的节点 根节点是黑色的 外部节点(NIL)都是黑色的 注意:这里的外部节点指的是这样的节点: 为了节省空间可以使他们指向同一个外部节点 对于C/C++语言来说可以不设外部节点,如果一个节点没有子节点,可以将其节点的指针域置为空,可以视空节点 为外部节点 如果一个节点是红色的,那么它的左右孩子节点必须是黑色的 对于每个节点,从该节点到其所有后代外部节点的简单路径上,所经过黑色节点的个数相同,也称为"黑高" 根据上述性质,使用C++语言定义树节点如下: #define RED true #define BLACK false template<typename T> struct tagRBNode { struct tagRBNode<T> * m_pLeft; //指向左孩子 struct tagRBNode<T> * m_pRight; //指向右孩子 struct tagRBNode<T> * m_pParent;//指向父节点 bool m_bRed; //节点颜色 T m_TDataElemet; //数据域 tagRBNode(T & data,bool bRed = RED): m_pParent(nullptr), m_pLeft(nullptr), m_pRight(nullptr), m

安排:《蚂蚁花呗1234面:Redis+分布式架构+MySQL+linux+红黑树》

让人想犯罪 __ 提交于 2019-11-29 00:24:10
前言: 大厂面试机会难得,为了提高面试通关率,建议朋友们在面试前先复盘自己的知识栈,依据掌握程度划分重要、优先级,系统地去学习!如果不准备充分就去参加面试,既会失去进入大厂的机会,更是对自己的不负责。 蚂蚁花呗一面(一个小时): 1、Java容器有哪些?哪些是同步容器,哪些是并发容器? 2、ArrayList和LinkedList的插入和访问的时间复杂度? 3、java反射原理, 注解原理? 4、说说一致性 Hash 原理 5、新生代分为几个区?使用什么算法进行垃圾回收?为什么使用这个算法? 6、HashMap在什么情况下会扩容,或者有哪些操作会导致扩容? 7、HashMap push方法的执行过程? 8、HashMap检测到hash冲突后,将元素插入在链表的末尾还是开头? 9、1.8还采用了红黑树,讲讲红黑树的特性,为什么人家一定要用红黑树而不是AVL、B树之类的? 10、https和http区别,有没有用过其他安全传输手段? 11、线程池的工作原理,几个重要参数,然后给了具体几个参数分析线程池会怎么做,最后问阻塞队列的作用是什么? 12、linux怎么查看系统负载情况? 13、请详细描述springmvc处理请求全流程? 14、spring 一个bean装配的过程? 15、项目用 Spring 比较多,有没有了解 Spring 的原理?AOP 和 IOC 的原理 蚂蚁花呗二面:

数据结构(二)--- 红黑树

左心房为你撑大大i 提交于 2019-11-28 22:23:13
一、简述 红黑树是一种特殊的二叉树,并且是优秀的自平衡查找树,下图为红黑树的示例: 红黑树具有以下几大特性: 1、根节点为黑色。 2、所有节点都是黑色或红色。 3、所有叶子节点(Null)都是黑色。 4、红色节点的子节点一定是黑色的。 5、任意一个节点到其叶子节点的所有路径上的黑色节点数量相同(黑色完美平衡二叉树)。 以上的五大特定也是维持红黑树结构的基本规则,但是明白了这些规则,不代表我们就明白了红黑树的设计原理及规则维持算法。 在我们日常的工作中多多少少都会接触到红黑树,特别是JDK1.8之后hashmap的底层采用了红黑树机构,接下来的博文中我们会一点点弄明白以下几个问题,也是笔者在学习之前不明白的两个问题: 1、红黑树为什么要维持自平衡、自平衡的好处是什么? 2、什么是左旋,右旋,变色? 3、 什么条件下需要进行左旋、右旋、变色? 二、红黑树的自平衡 根据上一节红黑树特性第5点可以知道,红黑树是一颗黑色完美平衡二叉树, 红黑树从根节点到叶子结点的最长路径不会超过最短路径的2倍 ; 这就保证了红黑树优秀的查找性能,其查找的时间复杂度为O(logn); 当插入或删除阶段操作过程中,会破坏此平衡结构,当平衡遭到破坏,程序会进行一系列操作来重新维持平衡,这一过程就是自平衡;这一系列操作就是左旋、右旋、变色。 1、左旋: 对当前节点进行左旋:当前节点的右子节点变为父节点

C++基础

假装没事ソ 提交于 2019-11-28 21:36:32
静态多态和动态多态优缺点 avl树与红黑树的效率 实际上红黑树的查找大约需要logN次比较, 并且查找不可能超过 2*logN 次比较. 插入和删除的时间要增加一个常数因子, 因为不得不在下行的路径上和插入点执行颜色变化和旋转. 平均起来, 一次插入大约需要一次旋转. 因此插入的时间复杂度还是O(logN), 但是比在普通的二叉搜索树中要慢 avl树查找的时间复杂度为O(logN), 因为树一定是平衡的. 但是, 由于插入或删除一个节点时需要扫描两趟树, 一次向下查找插入点, 一次向上平衡树 AVL树保持每个结点的左子树与右子树的高度差至多为1, 从而可以证明树的高度为O(log(n)). Insert操作与delete操作的复杂度均为log(n), 旋转操作可能会达到log(n)次 avl树不如红黑树效率高, 也不如红黑树常用 有了avl树为什么还需要红黑树 1、红黑树放弃了追求完全平衡, 追求大致平衡, 在与平衡二叉树的时间复杂度相差不大的情况下, 保证每次插入最多只需要三次旋转就能达到平衡, 实现起来也更为简单. 2、平衡二叉树追求绝对平衡, 条件比较苛刻, 实现起来比较麻烦, 每次插入新节点之后需要旋转的次数不能预知. avl树是为了解决二叉查找树退化为链表的情况, 而红黑树是为了解决平衡树在插入、删除等操作需要频繁调整的情况 总结 红黑树的查询性能略微逊色于AVL树