红黑树

treemap使用了解

旧街凉风 提交于 2019-12-02 05:34:54
参考了https://www.jianshu.com/p/d9ad7f6d75a0 https://www.zhuxiaodong.net/2018/collection-in-java-treemap/ https://yanglukuan.github.io/2017/09/06/java/Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E4%B9%8BTreeMap%E8%AF%A6%E8%A7%A3/ https://blog.csdn.net/yan_wenliang/article/details/51092633 心不够静,先了解treemap,心静脑子到位的时候再吃透原理 存储结构 分析一个数据类型最好的办法就是看它的内部存储结构,通过分析存储的数据结构,我们可以更清楚的看到它的实现原理和方法,从而更好的去使用,因为特定的数据结构只有用在特定的场景下,才会发挥它最大的作用。 TreeMap 内部使用的数据结构为 红黑树(Red-Black tree) ,关于红黑树,这里简单介绍一下,红黑树属于二叉排序树,但是在二叉排序树的基础上,又增加了一些规则,比如定义节点的着色等,这样就不会出现一些极端的情况,比如,整个树出现了偏离,变为了单分支结构的树,这样,整个树的高度就是n,n为全部的节点数。在这样的节点分部情况下

jdk1.8新特性

↘锁芯ラ 提交于 2019-12-02 02:03:42
1. 速度更快 – 红黑树 HashMap中的红黑树 HashMap中链长度大于8时采取红黑树的结构存储。 红黑树,除了添加,效率高于链表结构。 2. 代码更少 – Lambda Lambda表达式的基础语法:Java8引入了一个新的操作符“->”,该操作符成为箭头操作符或者Lambda操作符,箭头操作符将Lambda表达式拆分成两部分 左侧:Lambda表达式的参数列表 右侧:Lambda表达式中所需执行的功能,即Lambda体。 3. 强大的Stream API – Stream 一系列流水线式的中间操作。 流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。 注意: ①Stream自己不会存储元素。 ②Stream不会改变源对象。相反,会返回持有新结果的新Stream。 ③Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。 4. 便于并行 – Parallel 在必要的情况下,将一个大任务进行必要的拆分Fork成若干个小任务,再将小任务的运算结果进行Join汇总。 5. 最大化减少空指针异常 – Optional 是一个容器类,代表一个值存在或不存在,原来用null 表示一个值不存在,现在Optional 可以更好的表达这个概念。并且可以避免空指针异常。 6、ConcurrentHashMap Jdk1.7时隔壁级别CocnurrentLevel

红黑树原理以及插入、删除算法 附图例说明

折月煮酒 提交于 2019-12-01 21:46:17
一、概念 R-B Tree,全称是Red-Black Tree又称红黑树,它是一种特殊的二叉查找树,红黑树的每个节点上都有存储位表示节点的颜色,可以是红或黑。 二、特性 1、每个节点或者是红色,或者是黑色 2、根节点是黑色的 3、每个叶子节点(NIL)是黑色的。注意:这里的叶子节点,是指为空的叶子节点 4、如果一个节点是红色的,则它的子节点必须是黑色的 5、从任意一个节点到其叶子的所有路径中,所包含的黑节点数量是相同的 特性解析1:根据特性4可知,从每个叶子节点到根节点的所有路径中不能有两个连续的红节点 特性解析2:根据特性5可知,没有一条路径会比其它路径长出两倍,因而红黑树是接近平衡的二叉树 三、应用 红黑树主要用于存储有序的数据,它的时间复杂度是O(logn),非常高效 四、基本操作——插入 1、简介 红黑树的基本操作是添加和删除,在对红黑树进行添加和删除之后,都会用到旋转方法。为什么要用旋转方法呢?因为添加或删除红黑树的节点之后,红黑树就发生了变化,可能就不满足红黑树的5条性质了,也就不是一颗红黑树了。而通过旋转可以使这棵树重新成为红黑树,即旋转的目的就是为了保证红黑树的特性 左旋:对节点x进行左旋,意味着将“x的右孩子变成x的父亲”,而将“x原先的右孩子的左孩子变成x的右孩子”。即左旋中的“左”是指将别旋转的节点变成一个左节点 右旋:对节点x进行右旋,意味着将

java红黑树

浪尽此生 提交于 2019-12-01 19:49:43
红黑树性质 1、每个结点或是红色的,或是黑色的 2、根节点是黑色的 3、每个叶结点(NIL)是黑色的 4、如果一个节点是红色的,则它的两个儿子都是黑色的。 5、对于每个结点,从该结点到其叶子结点构成的所有路径上的黑结点个数相同。 和AVL树的比较 AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效。但AVL树插入、删除结点后旋转的次数比红黑树多。 红黑树用非严格的平衡来降低插入删除时旋转的次数。 因此,如果你的业务中查找远远多于插入、删除,那选AVL树; 如果查找、插入、删除频率差不多,那么选择红黑树。 插入过程 默认插入的结点为红色。为何? 因为红黑树中黑节点至少是红节点的两倍,因此插入节点的父节点为黑色的概率较大,而此时并不需要作任何调整,因此效率较高。 1. 父为黑 插入后无需任何操作。由于黑节点个数至少为红节点的两倍,因此父为黑的情况较多,而这种情况在插入后无需任何调整,这就是红黑树比AVL树插入效率高的原因! 2. 父为红 父为红的情况破坏了红黑树的性质,此时需要根据叔叔的颜色来做不同的处理。 1.叔叔为红 此时很简单,只需交换爸爸、叔叔和爷爷的颜色即可。 此时若爷爷节点和太爷爷节点颜色相同,再以爷爷节点为起始节点,进行刚才相同的操作,即:根据爷爷的兄弟颜色做相应的操作。 2.叔叔为黑 此时较为复杂

Mysql中的索引

末鹿安然 提交于 2019-12-01 17:13:19
1,什么是索引,为什么要使用索引? 索引是帮助Mysql高效获取数据的排好序的数据结构。建立索引可以帮助我们快速检索我们需要的信息,减少磁盘的I/O次数,加快检索速度。索引的数据结构包括:二叉树,红黑树,Hash表,B-树等。 2,数据查询的方式 二叉查找树的方式查找信息 普通情况下,在一个二叉树中查找到5非常快速。只需要2步,但在某些极端情况下,如对于顺序插入信息的二叉树,查找到我们需要的信息就非常麻烦了。 红黑树 红黑树是一种 自平衡二叉查找树 ,就是会自动平衡更新根节点和其它节点的位置,也就是说根节点和其它节点的位置是不固定,会根据插入的信息进行动态改变的。 按照1~5的顺序插入数据后,会重新排列分支节点的位置。 对于少量数据使用红黑树是完全可以的,但是一个项目的数据库中存储的数据都是10万条以上,再使用红黑树,树的度又会变得很大了。这个时候就可以使用B 树了。 B 树 B树是一种 多路自平衡搜索树 ,它是一种特殊的平衡二叉树,但是B书允许每个节点有更多的子节点。B树示意图如下: B树的特点: (1)所有键值分布在整个树中(2)任何关键字出现且只出现在一个节点中 (3)搜索有可能在非叶子节点结束(4)在关键字全集内做一次查找,性能逼近二分查找算法 比如我们想要找到主键为28的数据,过程如下: 1,根据根节点找到磁盘块1,进行一次I/O(磁盘的输入和输出)操作; 2

重新认识Java 8的HashMap

瘦欲@ 提交于 2019-12-01 11:46:32
【转自】 美团技术博客 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类的特点做一些说明: (1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。 (2) Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似

红黑树 -- 草稿

天涯浪子 提交于 2019-12-01 10:54:58
---恢复内容开始--- - 这只是一篇草稿,还没排版,之前一直想给自己写一个文章的模板,一直还没写,所以估计写的比较慢,所以先放出来文章,后面再来填坑吧。 这篇文章的初衷是看到面试问题有问到红黑树,甚至有手撕红黑树代码的?可怕,红黑树的讨论情况很多,一不小心就绕进去,真让人犯难,而且网上的文章各有各的说法,不少人理解甚至是错误的。 - 红黑树:红黑树是一种二叉平衡树,二叉查找树,它牛逼之处就在于它足够的平衡,可以达到高度至多2lg(n+1),所以在java中的treemap和c++ set, multiset, map, multimap就使用的红黑树。 - 红黑树的性质:1. 结点分为红色和黑色两种 2.根节点是黑色的 3.每个叶子结点(nil)是黑色的(就是空代表了黑色) 4.不存在父子都是红色的情况(连续两个红色) 5.任意孩子到根节点的路径上的黑色数量都是相等的(important) - 本文将解释 以下内容: 1. 红黑树的插入(简单的插入)与调整(调整平衡)。 2. 红黑树的删除(也带有调整,使其便于调整平衡)与调整(调整平衡)。 ### 插入 #### 插入方式:   先考虑插入什么颜色的结点,这里需要说明颜色只是我们用于保证平衡的一种方法,与数据无关。 因为插入黑色结点除非在根节点,否则一定会导致一个分支上的所有子分支都多了一个黑,如此不满足性质5(简称 路黑同)

Java HashMap 和 ConcurrentHashMap

被刻印的时光 ゝ 提交于 2019-12-01 10:21:00
转自: http://www.codeceo.com/article/java-hashmap-concurrenthashmap.html 前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据。 本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 HashMap,没有它就不会有后面的 ConcurrentHashMap。 HashMap 众所周知 HashMap 底层是基于 数组 + 链表 组成的,不过在 jdk1.7 和 1.8 中具体实现稍有不同。 Base 1.7 1.7 中的数据结构图: 先来看看 1.7 中的实现。 这是 HashMap 中比较核心的几个成员变量;看看分别是什么意思? 初始化桶大小,因为底层是数组,所以这是数组默认的大小。 桶最大值。 默认的负载因子(0.75) table 真正存放数据的数组。 Map 存放数量的大小。 桶大小,可在初始化时显式指定。 负载因子,可在初始化时显式指定。 重点解释下负载因子: 由于给定的 HashMap 的容量大小是固定的,比如默认初始化: public HashMap() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); } public HashMap(int

面试官:谈谈你对mysql索引的认识?

南笙酒味 提交于 2019-12-01 08:49:52
引言 大家好,我渣渣烟。我曾经写过一篇 《面试官:讲讲mysql表设计要注意啥》 ,当时写完后,似乎效果还行! 于是呢,决定再来一个mysql的数据库专题,这篇我们就来谈谈关于索引方面的mysql面试题。还是老规矩,讲的是在Innodb存储引擎下的情形,毕竟我还真没用过Mysiam之类的存储引擎。 ps :其实很早就想写了,一直偷懒! 其实这下面每个问题,我都可以讲一篇文章出来!而且这些问题,不是我凭空编的。如下图所示( 注意看第三题 ) 所以我回忆了一下,索引常见考点有哪些,总结成了这篇文章! 主要题目有下面这些 (1)你一般怎么建索引的? (2)讲讲索引的分类?你知道哪些? (3)如何避免回表查询?什么是索引覆盖? (4)现在我有一个列,里头的数据都是唯一的,需要建一个索引,选唯一索引还是普通索引? (5)mysql索引是什么结构的?用红黑树可以么? (6)mysql某表建了多个单索引,查询多个条件时如何走索引的? 正文 1、你一般怎么建索引的? 烟哥注: 曾记得有一个粉丝来找我的时候,出现如下搞笑一幕 渣渣烟:"你这个简历上写了拥有SQL优化经验,你怎么建索引的? " 只见该粉丝嘿嘿一笑..说道:"就那样建啊…" 渣渣烟:"噢(第二声),就哪样建啊…" 粉丝:"…就网上说的那些索引规则啊" 渣渣烟:"那你怎么知道那些SQL出问题,需要建索引呢? " 粉丝:"我….." 嗯

HashMap了解吗?

怎甘沉沦 提交于 2019-12-01 07:23:15
HashCode() HashMap 底层实现 HashMap 的长度为什么默认初始长度是16,并且每次resize()的时候,长度必须是2的幂次方? HashMap 死链问题 Java 8 与 Java 7对比 为什么要使用红黑树? 说说hashmap如何处理碰撞的,或者说说它的扩容?   一,简介 (1)桶(capacity)容量,即数组长度:DEFAULT_INITIAL_CAPACITY=1<<4;默认值为16,即在不提供有参构造的时候,声明的hashmap的桶容量; (2)MAXIMUM_CAPACITY = 1 << 30;   极限容量,表示hashmap能承受的最大桶容量为2的30次方,超过这个容量将不再扩容,让hash碰撞起来吧! (3)static final float DEFAULT_LOAD_FACTOR = 0.75f;   负载因子(loadfactor,默认0.75),负载因子有个奇特的效果,表示当当前容量大于(size/)时,将进行hashmap的扩容,扩容一般为扩容为原来的两倍。 (4)int threshold;阈值(yu)   阈值算法为capacity*loadfactory,大致当map中entry数量大于此阈值时进行扩容(1.8) (5)transient Entry<K,V>[] table = (Entry<K,V>[])