红黑树

树-红黑树(R-B Tree)

我的未来我决定 提交于 2019-11-26 14:57:37
红黑树概念 特殊的二叉查找树,每个节点上都有存储位表示节点的颜色是红(Red)或黑(Black)。时间复杂度是O(lgn),效率高。 特性: (1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。 (3)每个叶子节点(NIL)是黑色。(只为空(NIL或null)的节点) (4)如果一个节点是红色的,则它的子节点必须是黑色的。(黑结点可连续,红结点不能连续) (5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。 定理: 一棵含有n个节点的红黑树的高度至多为2log(n+1) . 证明:数学归纳法证明其逆否命题“高度为h的红黑树至少有2^(h/2 )-1个结点” 黑结点高度bh(x) >= h/2, 所以证明 “高度为h的红黑树至少有2^bh(x)-1个黑结点” 红黑树的旋转 左旋 左旋中的“左”,意味着“被旋转的节点将变成一个左节点” 。 LEFT-ROTATE(T, x) y ← right[x] // 前提:这里假设x的右孩子为y。下面开始正式操作 right[x] ← left[y] // 将 “y的左孩子” 设为 “x的右孩子”,即 将β设为x的右孩子 p[left[y]] ← x // 将 “x” 设为 “y的左孩子的父亲”,即 将β的父亲设为x p[y] ← p[x] // 将 “x的父亲” 设为 “y的父亲” if p[x] = nil[T]

Java集合源码分析——ConcrretHashMap(JDK1.8)

耗尽温柔 提交于 2019-11-26 12:44:28
Map集合–ConcurrentHashMap 这篇文章只是我一个菜鸟对ConcurrentHashMap的总结,可能有遗漏甚至有错误的地方,如果有什么理解的不对的地方还烦请各位指出,或者有什么想法,欢迎交流。 我在尝试学习并分析ConcurrentHashMap的时候,在网上搜索的一些资料,但这些资料的质量参差不齐,很多人文章名字赫然写着“一文搞懂ConcurrentHashMap”、“深入浅出…”等,很多这种文章要么停留在总结层面,要么就是简简单单把源码图片贴出来,总之就是看了跟没看没啥区别,还不如自己看呢。咱没那个水平就别出来误人子弟行不行。 在学习的时候,结合了两篇文章,这两篇文章的质量还是很高的,一篇是: https://www.cnblogs.com/study-everyday/p/6430462.html 另一篇。。。由于时间有点久了,又找不着了,文章分析的很是到位,哪天我在历史记录中找到了,一定贴出来! 这应该是常用集合框架中最难的一个了。坐稳,发车!!! 众所周知HashMap是线程不安全的,多线程并发操作时可能出现get方法无限循环,从而导致CPU占满。 同时解决HashMap线程不安全的替代方案有三种: 1、使用Hashtable 2、使用Collections.synchronzedMap(Map<k,V> m)方法生成一个线程安全的HashMap 3

头条后端面经_1面

吃可爱长大的小学妹 提交于 2019-11-26 10:31:30
1、java gc 2、java class的加载过程 3、java hashmap、 为什么用红黑树、红黑树邻接点为啥是8 。 4、拜占庭问题 5、一致性哈希 6、如何控制负载均衡。 7、http码 302 403 。 8、https 加密过程。 9、操作系统虚存实现原理,交换,覆盖区别。 10、paxos算法。 11、NP 问题、 举例。 12、 缓冲区满异常是什么原因。 13、 innodb 和 mysalm的区别。 14、堆排序的时间复杂度、空间复杂度、排序的的过程。 15、spring问题。 16、算法 : 对一个八位数有三种操作: 加一、减一、反转 。 至少多少次操作可以把一个八位数A变成八位数B。 参考: https://www.nowcoder.com/discuss/215891?type=2&order=0&pos=10&page=1 大量面试经验以及学习资料书籍请关注:AVAJ 回复"offer"进行获取 365篇大厂java面经 你想要的我这里都有 来源: https://www.cnblogs.com/DoubleP/p/11318065.html

HashMap之get()剖析

流过昼夜 提交于 2019-11-26 09:53:51
上次我们已经剖析了get()方法,这次来看看put()方法。 1.HashMap的get()方法剖析: public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value; } 可见,也是将key值进行hash()之后,找到对应的桶数组,再调用getNode()进行查找。 final Node<K,V> getNode(int hash, Object key) { Node<K,V>[] tab; Node<K,V> first, e; int n; K k; //若哈希表不为空,并且当前索引位置有元素 if ((tab = table) != null && (n = tab.length) > 0 && (first = tab[(n - 1) & hash]) != null) { //若在一个桶中,并且当前索引位置的key值与要查找的key值相等 //说明找到了,返回该值 if (first.hash == hash && ((k = first.key) == key || (key != null && key.equals(k)))) return first; //若key值不相同,且还有元素 if ((e = first

java数据结构——红黑树(R-B Tree)

半腔热情 提交于 2019-11-26 07:50:00
红黑树相比平衡二叉树(AVL)是一种弱平衡树,且具有以下特性: 1、每个节点非红即黑; 2、 根节点是黑的; 3、每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的; 4、如图所示,如果一个节点是红的,那么它的两儿子都是黑的; 5、对于任意节点而言,其到叶子点树NULL指针的每条路径都包含相同数目的黑节点; 6、 每条路径都包含相同的黑节点 来源: https://www.cnblogs.com/hardhp74520/p/11317028.html

HashMap原理详解

痞子三分冷 提交于 2019-11-25 18:52:51
本文的源码基于jdk8版本,讲一下hashMap的核心基本和重难点知识 概述 一、构造函数 二、put操作 1. hash函数 2. 数组下标计算 3. 操作步骤 总结 三、扩容操作 resize jdk1.8的扩容操作 如何避免并发问题导致链表转移行程环 jdk1.7 扩容并发问题分析 五、红黑树 红黑树特性 左旋和右旋 红黑树和平衡二叉树对比 总结 概述 hashMap的数据结构是 数组+链表+红黑树 数组查找速度快 链表插入和删除速度比较快 链表什么时候变成变成红黑树 HashMap就是使用哈希表来存储的。哈希表为解决冲突,可以采用开放地址法和链地址法等来解决问题,Java中HashMap采用了链地址法。链地址法,简单来说,就是数组加链表的结合 节点数大于等于8,并且容量大于64才会把单向链表转换成红黑树 为了优化查找性能, 链表转变成红黑树, 以将 o(n)复杂度的查找效率提升至o(log n) // 1. 如果链表长度大于等于8 if (binCount >= TREEIFY_THRESHOLD - 1) { treeifyBin(tab, hash); break; } final void treeifyBin(Node<K,V>[] tab, int hash) { int n, index; Node<K,V> e; // 2. 如果容量小于64 进行扩容操作