红黑树

Java集合必会14问(精选面试题整理)

一世执手 提交于 2019-11-30 01:07:29
前言.... 前言:把这段时间复习的关于集合类的东西整理出来,特别是HashMap相关的一些东西,之前都没有很注意1.7 ->> 1.8的变化问题,但后来发现这其实变化挺大的,而且很多整理的面试资料都没有更新(包括我之前整理的...) 1)说说常见的集合有哪些吧? 答:Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等 2)HashMap与HashTable的区别? 答: HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的; HashMap允许K/V都为null;后者K/V都不允许为null; HashMap继承自AbstractMap类;而Hashtable继承自Dictionary类; 3)HashMap的put方法的具体流程? 图引用自:https://blog.csdn.net/u011240877/article

区间树

回眸只為那壹抹淺笑 提交于 2019-11-29 22:25:46
区间树 注意: 区间树和线段树不一样哦,线段树是一种特殊的区间树。 区间树 : 区间树是在 红黑树基础上 进行扩展得到的支持以 区间为元素 的动态集合的操作,其中每个节点的关键值是区间的左端点。通过建立这种特定的结构,可是使区间的元素的查找和插入都可以在 O(lgn) 的时间内完成。相比于基础的红黑树数据结构,增加了一个 max[x] ,即以 x 为根的子树中所有区间的断点的最大值。逻辑结构如下所示: 区间树具有和红黑树一样的性质,并且区间树的基础操作和红黑树的基础操作一样。 红黑树的性质如下:(一定要牢记哦!) ( 1 )节点要么是红色的,要么是黑色的 ( 2 )根节点是黑色的 ( 3 )每个叶节点(即空节点)是黑色的 ( 4 )若节点是红色的,则它的孩子节点必为黑色 ( 5 )对每个节点,从该节点到它的子孙叶子节点的所有路径上包含相同的黑色节点。 线段树 : 线段树是一种平衡二叉查找树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。主要的处理思想是基于分治的思想。它的逻辑结构如下: 设根节点的区间为 [a,b), 区间长度为 L = b - a ,线段树的性质: ( 1 )线段树是一个平衡树,树的高度为 log(L) ( 2 )线段树把区间上的任意长度为 L 的线段都分成不超过 2log(L) 线段的并 线段树基础存储结构如下:(这里使用数组模拟指针

内核数据结构之红黑树

落爺英雄遲暮 提交于 2019-11-29 21:42:40
红黑树是一种自平衡的二叉查找树,是 Linux 主要的二叉树结构。红黑树有一个特殊的颜色属性,要么红色,要么黑色。红黑树通过强制以下条件来保证红黑树仍然是半平衡的。 所有结点要是红色或黑色的。 叶子结点是黑色的。 叶子结点不包含数据。 所有非叶子结点有两个孩子。 如果一个结点是红色,那么它的两个孩子都为黑色。 从某个结点出发,到达任何叶子结点的路径中包含的黑色结点相同。 上述属性表明,最深的叶子的深度不会超过最浅的叶子的深度的二倍。这样,该树总是半平衡的。 在 Linux 中,红黑树称为 rbtree 。分别声明和定义在 <linux/rbtree.h> 和 lib/rbtree.c 中。一个 rbtree 的根总是由结构 rb_root 来表示。为了创建一个新的红黑树,我们要分配一个新的 rb_root 并将其初始化为特殊值 RB_ROOT : struct rb_root root = RB_ROOT 。 单个结点由结构 rb_node 来表示。由于 C 语言不支持泛型编程,所以 rbtree 并没有提供查找和插入程序,编程人员必须自行定义,不过可以使用 rbtree 已经提供的一些帮助函数。 红黑树查找程序实现的一个例子 struct page * rb_search_page_cache(struct inode *inode, unsigned long offset)

树内容理解之红黑树

梦想的初衷 提交于 2019-11-29 20:49:45
明白红黑树前需要理解的前提概念:   二叉查找树(BST)     1.左子树上所有节点的值均<=他的根节点的值     2.右子树上所有节点的值均>=他的根节点的值     3.左右子树也一定分别为二叉查找树 二叉查找树利用和二分查找相同的概念来进行数据的便捷查找:(二分查找见排序算法解释) 如果根节点足够大,二叉查找树“左腿”会很长。如下图: 此时为了平衡左腿节点,(最长路径不超过最短路径的两倍)引入平衡的二叉查找树=> 红黑树 : 红黑树满足:(在满足树自身是一个二叉查找树BST的前提下)   1.节点是红色或者黑色。   2.根节点是黑色。   3.每个叶子的节点都是黑色的空节点。   4.每个红色节点的两个子节点都是黑色的。   5.从任意节点到其每个叶子的所有路径都包含相同的黑色节点。 来源: https://www.cnblogs.com/saber123/p/11531581.html

二叉树的算法时间复杂度

你离开我真会死。 提交于 2019-11-29 18:51:13
二叉搜索树,平衡二叉树,红黑树的算法效率 操作 二叉查找树 平衡二叉树 红黑树 查找 O(n) O(logn) Olog(n) 插入 O(n) O(logn) Olog(n) 删除 O(n) O(logn) Olog(n) Olog(n)怎么算出来的 在一个树中查找一个数字, 第一次在根节点判断,第二次在第二层节点判断 以此类推,树的高度是多少就会判断多少次 树的高度和节点的关系就是以2为底,树的节点总数n的对数 来源: https://www.cnblogs.com/geektcp/p/11526925.html

红黑树存在的合理性

我只是一个虾纸丫 提交于 2019-11-29 18:18:43
写在前面   主要描述为什么有了二叉查找树/平衡树还需要红黑树 1、二叉查找树的缺点   二叉查找树,相信大家都接触过,二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大,如图   基于二叉查找树的这种特点,我们在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点。n 个节点的二叉查找树,正常的情况下,查找的时间复杂度为 O(logn)。   之所以说是正常情况下,是因为二叉查找树有可能出现一种极端的情况,例如    这种情况也是满足二叉查找树的条件,然而,此时的二叉查找树已经近似退化为一条链表,这样的二叉查找树的查找时间复杂度顿时变成了 O(n),可想而知,我们必须不能让这种情况发生,为了解决这个问题,于是我们引申出了平衡二叉树。 2、平衡二叉树   平衡二叉树就是为了解决二叉查找树退化成一颗链表而诞生了,平衡树具有如下特点   1、具有二叉查找树的全部特性。   2、每个节点的左子树和右子树的高度差至多等于1。   例如:图一就是一颗平衡树了,而图二则不是(节点右边标的是这个节点的高度)   对于图二,因为节点9的左孩子高度为2,而右孩子高度为0。他们之间的差值超过1了。   平衡树基于这种特点就可以保证不会出现大量节点偏向于一边的情况了。关于平衡树如何构建、插入、删除、左旋、右旋等操作这里不在说明,具体可以看我之前写的一篇文章:

java高并发学习-死锁(一)

我怕爱的太早我们不能终老 提交于 2019-11-29 18:15:21
死锁发生的必要条件: 1、互斥条件 2、请求和保持条件 3、资源不剥夺条件 4、环路等待条件 多线程的最佳并发实践; 1、 使用本地变量 2、使用不可变类 3、最小化锁的作用域范围 : S = 1/(1-a+a/n) (阿木达尔定律) 其中,a为串行计算部分所占比例,n为并行处理结点个数。这样,当a=0时,最大加速比s=n;当a=1时,最小加速比s=1;当n→∞时, 极限加速 比s→ 1/a,这也就是加速比的上限。例如,若串行代码占整个代码的25%,则并行处理的总体性能不可能超过4。这一公式已被学术界所接受,并被称做“阿姆达尔定律”(Amdahl law)。 4、使用线程池的Executor,而不是使用new Thread(); 5、宁可使用同步也不要使用wait()和notify() 6、使用blockingQueue实现生产者消费者模式 7、使用并发结合而不是加了锁的同步集合 8、使用semaphore创建有界的访问 9、宁可使用同步代码块,也不要使用同步的方法 10、避免使用静态变量 hashmap和concurrenthashmap hashmap 最终要的两个参数是加载容量和扩容因子。 当当前使用内存超过加载容量和扩容因子的乘积的时候,就会对hashmap进行扩容,在扩容的过程中并不是线程安全的,在并发调用的时候,可能出现死循环。 concurrenthashmap1

关于红黑树旋转的理解

末鹿安然 提交于 2019-11-29 14:53:57
概述 红黑树的左旋和右旋比较费解,网上很多资料说的很复杂,这里我用望文生义的思维来解释左旋和右旋。可能对搜索资料的网友有帮助。 红黑树的定义 什么是红黑树? 红黑树(英语:Red–black tree)是一种自平衡二叉查找树, 是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 它在1972年由鲁道夫·贝尔发明,被称为"对称二叉B树", 它现代的名字源于Leo J.Guibas和RobertSedgewick于1978年写的一篇论文。 红黑树的结构复杂,但它的操作有着良好的最坏情况运行时间, 并且在实践中高效:它可以在O(logN)时间内完成查找,插入和删除, 这里的n是树中元素的数目。 红黑树的特性 红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。 在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 1、节点是红色或黑色。 2、根是黑色。 3、所有叶子都是黑色(叶子是NIL节点)。 4、每个红色节点必须有两个黑色的子节点。(从叶子到根之间不能有两个连续红色节点) 5、从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。 这些约束确保了红黑树的关键特性: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。 旋转 左旋 左旋图解(x左边节点逆时针旋转): a / \ b x -> x / \ / \ c d a d

红黑树

半城伤御伤魂 提交于 2019-11-29 14:02:57
前置知识: 1, BST(二叉搜索树) 定义:BST的中序遍历序列是一串单调序列,一般是升序序列 插入值e:顺着树向下查找,直到null,创建值为e的节点替代null 删除值e:查找到e,然后选择直接后继,先右然后左到底(升序),易证该节点为直接后继。找到直接后继之后,将e与直接后继交换位置,再删除e。 直接后继节点的特征:没有左孩子。 2,AVL树(平衡二叉树) 定义:在二叉搜索树的前提下满足如下条件,设仅一个节点的树高度为0,路径上每有一条边,高度加1。某节点高度等于该节点最长路径的边数;平衡条件,左右子树高度之差小于等于1,即h左-h右可以为 1,0,-1; 查找: 顺着树向下,很容易。 插入算法: 第一步:利用BST的搜索算法搜索到插入位置——必为某个叶节点的左右孩子:NULL(既然可以插入,必然搜索失败,而失败的查找指针必然落到叶节点的左右孩子:NULL上) 第二步:寻找三个节点x,y,z的位置关系。如何确定x,y,z?首先要知道,插入某个节点e可能会改变哪些节点的高度——答案是从e到根节点这条路径上L的所有节点的高度。首先确定x,x为路径L上,从e开始逆向到根节点的第一个因为插入e导致高度不平衡的节点;其次确定y,对比x的左右孩子,更高的设置为y;最后确定z,对比y的左右孩子,更高的设置为z( 若高度相同,取左还是右取决于y为左孩子还是右孩子 )。确定好x,y,z后

红黑树

一个人想着一个人 提交于 2019-11-29 12:20:54
自平衡二叉查找树 它是为了解决二叉查找树的查找时间复杂度最差是O(n)的问题而发明的数据结构算法。 BST的查找运行时间和BST的高度有关。一个树的高度指的是从树的根开始所能到达的最长的路径长度。 因为二叉搜索树的结构可能是一个链表,在这种情况下,在 BST 中查找节点与在数组(Array)中查找就基本类似了。 如这个例子: 有6个节点,它的时间复杂度是O(n)。假如要查找节点200,那么节点会比较5此,相当于遍历所有节点了。 这太浪费时间了,因此降低树的高度,就可以减少时间复杂度。 我们知道二叉搜索树的搜索节点的最小时间复杂度是 O(log­ 2 n)。 因此找到一个高度和节点数量的最佳比例。让它的时间复杂度维持在 O(log­ 2 n)。 期望是: 如果树中节点的数量为 n,则一棵满足O(log 2 n) 渐进运行时间的 BST 树的高度应接近于比 log 2 n 小的最大整数。 但实际问题是: 如何保证 BST 的拓扑结构始终保持树高度与节点数量的最佳比例? 因为 BST 的拓扑结构与节点的插入顺序息息相关,一种方式是通过数据的乱序来保证。所以必须在插入节点前就得到数据。 但是如果无法掌控数据的来源,怎么做?一种方案是新的节点插入不会打乱BST树的平衡。这种始终维持树的平衡状态的数据结构称为:自平衡二叉查找树。self-balancing binary search tree