红黑树

HashMap

烈酒焚心 提交于 2019-12-05 02:26:44
1、为什么用HashMap? 1.1、HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射 1.2、HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改 1.3、HashMap是非synchronized,所以HashMap很快 1.4、HashMap可以接受null键和值,而Hashtable则不能(原因就是equlas()方法需要对象,因为HashMap是后出的API经过处理才可以) 2、HashMap的工作原理是什么? HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。 当我们给 put()方法传递键和值时,我们先对键调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket位置来储存Node 对象。 这里关键点在于指出, HashMap是在bucket中储存键对象和值对象,作为Map.Node 。 以下是 HashMap初始化 ,简单模拟数据结构 以下是具体的 put过程(JDK1.8版) 1、对Key求Hash值,然后再计算下标 2、如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的Hash值相同,需要放到同一个bucket中) 3、如果碰撞了

数据结构与算法之美学习笔记:第十七讲

£可爱£侵袭症+ 提交于 2019-12-05 00:22:11
一、课前思考 两节我们讲了二分查找算法。当时我讲到,因为二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗? 实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫作跳表(Skiplist),也就是今天要讲的内容。 跳表这种数据结构对你来说,可能会比较陌生,因为一般的数据结构和算法书籍里都不怎么会讲。但是它确实是一种各方面性能都比较优秀的动态数据结构,可以支持快速的插入、删除、查找操作, 写起来也不复杂,甚至可以替代红黑树(Red-blacktree)。 Redis中的有序集合(Sorted Set)就是⽤跳表来实现的。如果你有一定基础,应该知道红黑树也可以实现快速的插入、删除和查找操作。 那Redis为什么会选择用跳表来实现有序集合呢? 为什么不用红黑树呢?学完今天的内容,你就知道答案了。 二、如何理解跳表 1、单链表 2、怎么提高查询效率 1、18个节点一级索引 2、18个节点二级索引 3、64个节点建立五级索引 3、当链表的⻓度n⽐较⼤时 三、用跳表查询到底有多快 1、如果链表⾥有n个结点,会有多少级索引? 2、复杂度推算过程 3、M值为什么是3 4、基于单链表实现二分查找 四、跳表是不是很浪费内存 1、索引节点数是一个等比数列 2、通过等⽐数列求和公式 3、实际上

红黑树

半腔热情 提交于 2019-12-04 23:30:26
红黑树第一部分:介绍 红黑树是一种自平衡的二叉搜索树(BST),其中每个节点遵循以下规则。 每个节点都有红色或黑色 树的根总是黑色的 没有两个相邻的红色节点(红色节点不能有红色的父节点或红色的子节点) 从节点(包括根)到其任何子代NULL节点的每条路径都具有相同数量的黑色节点 为什么要用红黑树 大多数BST操作(例如,搜索,最大,最小,插入,删除等)取 \(O(H)\) 时间,其中H是BST的高度。对于倾斜二叉树,这些操作的成本可以变为 \(O(N)\) 。如果我们确保在每次插入和删除后树的高度保持 \(O(logN)\) ,那么我们可以保证所有这些操作的上限为 \(O(logN)\) 。红黑树的高度始终为 \(O(logN)\) ,其中n是树中的节点数。 和AVL树作比较 与红黑树相比,AVL树更平衡,但它们在插入和删除期间可能会导致更多的旋转。因此,如果您的应用程序涉及许多频繁的插入和删除,那么红黑树应该是首选的。如果插入和删除的频率较低,并且搜索是更频繁的操作,则AVL树应该优先于红黑树。 红黑树如何确保平衡? 理解平衡的一个简单示例是,红黑树中不可能有3个节点的链。我们可以尝试任何颜色的组合,看它们是否违反了红黑树的属性。 A chain of 3 nodes is nodes is not possible in Red-Black Trees. Following

红黑树和B+树一看就懂

家住魔仙堡 提交于 2019-12-04 20:23:34
红黑树:二叉查找树+平衡二叉树(大致平衡的) 核心性质:从根节点到任意叶子节点最长的路径不大于最短路径的二倍。 在插入和删除操作中核心性质可能不再满足,所以在插入删除中要进行判断是否满足,但是直接判断是否满足核心性质麻烦,就用了五条容易判断的性质进行等价替换。 五条性质: 1.根节点是黑色的。 2.节点非黑即红。 3.不每条路径上不能有连续两个红色节点。 4.从任意节点到叶子节点黑节点数量相同。 5.叶子节点都是黑色的。 为了算法的描述方便设置每个叶子节点都是黑色哨兵节点。 插入过程(五条):默认插入的节点是红色节点,要是默认是黑色的会很麻烦(由于性质4)。 1.如果插入节点的父节点不存在就将颜色改为黑色。(因为这个节点就是根节点) void case1(node){   if(node.parent==NULL){   node.color = black; }else {   case2(node) } } ****插入过程的五条判断实际上都是五个函数,并且内部都是一个if-else判断,在if中判断,else中调用下一个函数。形式都是上边这种 2.如果插入的节点的父节点是黑色,则ok,zhijiereturn。 3.如果插入的节点的父亲节点和叔叔节点是红色,则变化父叔节点为黑色,再把祖父节点变为红色,然后将祖父节点作为node,从case1开始判断。 4. (1

红黑树插入

落花浮王杯 提交于 2019-12-04 13:09:25
作为红色节点添加,如果添加之后的父节点是红色,违反红黑树规则,要进行处理。 分两大种情况: 一、叔节点也是红色,这说明祖父节点是黑色,那么把父节点和叔节点变黑,祖父节点变红,问题递归交给祖父节点去处理。如果递归到最后祖父节点是红色的而且是根节点,直接变黑即可。 二、叔节点是黑色的,这时候有四种情况,但是是2v2镜像的,考虑父节点是祖父节点的左子节点,而叔节点是祖父节点的右子节点的情况。在这种情况下,如果插入后节点是父节点的右子节点,把父节点左旋。 变成父节点是插入子节点的左子节点,这时候再右旋原祖父节点,这样的话插入后节点成为祖父节点,原父节点和原叔节点变成左右两个子节点,把插入后节点的颜色变黑,原叔节点的颜色变红即可。 来源: https://www.cnblogs.com/chuliang/p/11863924.html

Java集合

孤者浪人 提交于 2019-12-04 11:55:59
1.集合 image.png 1. List: 有序、可重复。可以通过索引快速查找,但进行增删操作时后续的数据需要移动,所以增删速度慢。 2. Set: 无序、不可重复。 3. Map: 键值对、键唯一、值不唯一。Map 集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对 map 集合遍历时先得到键的 set 集合,对 set 集合进行遍历,得到相应的值。 4. ArrayList: ArrayList 实现于 List、RandomAccess 接口,具有list的特性,有序,可以重复,并且可以插入空数据,也支持随机访问。ArrayList相当于动态数据(动态数组),其中最重要的两个属性分别是: elementData 数组,以及 size 大小,ArrayList 的主要消耗是数组扩容来在指定位置添加数据。增删是数组复制的过程,效率比较慢,但查询比较快。 5. Vector: Vector 也是实现于 List 接口,底层数据结构和 ArrayList 类似,也是一个动态数组存放数据。不过是在 add() 方法的时候使用 synchronized 进行同步写数据,但是开销较大,所以 Vector 是一个同步容器并不是一个并发容器。 6. LinkedList: LinkedList 底层是基于双向链表实现的,也是实现了 List 接口,所以也拥有 List

爱恨交织的红黑树

时光总嘲笑我的痴心妄想 提交于 2019-12-04 08:21:42
虐你千万遍,还要待她如初恋的红黑树,是否对她既欢喜又畏惧。别担心,通过本文讲解,希望你能有前所未有的感动。 红黑树也是二叉查找树,但比普通的二叉查找树多一些特性条件限制,每个结点上都存储有红色或黑色的标记。因为是二叉查找树,所以他拥有二叉查找树的所有特性。红黑树是一种自平衡二叉查找树,在极端数据条件插入时(正序或倒叙)不会退化成类链状数据,可以更高效的在O(log(n))时间内完成查找,插入,删除操作。 准备 在阅读本文之前,建议先阅读我上篇文章 《二叉查找树的解读和实现》 ,可以更好的帮助你理解红黑树。 特性 结点是红色或黑色 根结点必须为黑色 叶子结点(约定为null)一定为黑色 任一结点到叶子结点的每条路径上黑色结点数量都相等 不允许连续两个结点都为红色,也就是说父结点和子结点不能都为红色 查找 红黑树的查找方式和上篇文章所讲述的原理一样,这里就不重新讲述,以结点 [38,20,50,15,27,43,70,60,90] 为例,返回一颗红黑树。 普通操作 红黑树的插入和删除,分为多种情况,相对来说比较复杂。插入或删除新结点后的树,必须要满足上面五点特性的二叉查找树,所以要通过不同手段来调整树。但普通操作就是和普通二叉查找树操作一样。 比如普通插入中,因为每个结点只能是红色或黑色,所以我们定义新添加的非根结点默认颜色为红色。将新结点定义为红色的原因是为了满足特性4

[Java基础]Java Collection集合框架底层数据结构精简总结

浪子不回头ぞ 提交于 2019-12-04 03:49:34
Collection集合 List ArrayList:object数组 LinkedList:双向链表 线程安全? 否 异同? ArrayList适合随机存取 LinkedList适合插入删除操作,不适合搜索 Map HashMap:数组加链表,拉链法解决冲突 1.8之后超过阈值转为红黑树以减少搜索时间 非线程安全 初始大小为16,每次扩容为原来的二倍 HashTable:数组+链表组成; 安全; 全表锁,效率低,避免使用 ConcurrentHashMap:1.7采用分段数组(Segment)+链表进行实现 1.8采用与hashmap1.8中相同的数据结构:数组+链表/红黑树 TreeMap:红黑树 (自平衡的排序二叉树) LinkedHashMap: LinkedHashMap继承自HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。 Set HashSet: 无序 唯一 LinkedHashSet: LinkedHashSet 继承于HashSet,并且其内部是通过 LinkedHashMap 来实现的。 TreeSet:有序 唯一 引用: 这几道Java集合框架面试题几乎必问

java8新特性-HashMap

左心房为你撑大大i 提交于 2019-12-04 01:00:33
HashMap: 数组+链表+红黑树来实现的 注意:1.当链表大约8或者总容量大于64,就转换成红黑树 2.除了添加,红黑树效率慢,其他的情况都比链表快 ConcurrentHashMap:现在把重入锁变成了CAS算法(无锁),提高效率 注意:1.CAS算法为什么可以提高效率?CAS是底层操作系统支持的算法 大家想看 红黑树和CAS算发,请关注我,他们有相应的在以后有相应的介绍 来源: https://www.cnblogs.com/chenchun/p/11821399.html

Java 8系列之重新认识HashMap

别来无恙 提交于 2019-12-04 00:00:38
摘要 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类似,不同的是它承自Dictionary类