红黑树

JDK TreeMap Red-Black Tree

你离开我真会死。 提交于 2020-03-23 19:34:16
3 月,跳不动了?>>> 介绍另一种平衡二叉树:红黑树( Red Black Tree ),红黑树由 Rudolf Bayer 于 1972 年发明,当时被称为平衡二叉 B 树( symmetric binary B-trees ), 1978 年被 Leonidas J. Guibas 和 Robert Sedgewick 改成一个比较摩登的名字:红黑树。 红黑树和之前所讲的 AVL 树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。自从红黑树出来后, AVL 树就被放到了博物馆里,据说是红黑树有更好的效率,更高的统计性能。不过在我了解了红黑树的实现原理后,并不相信这是真的,关于这一点我们会在后面进行讨论。 红黑树和 AVL 树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是 AVL 树中的非常严格的平衡。之前我们在讲解 AVL 树时,已经领教过 AVL 树的复杂,但 AVL 树的复杂比起红黑树来说简直是小巫见大巫。红黑树是真正的变态级数据结构。 红黑树的平衡 红黑树首先是一棵二叉查找树,它每个结点都被标上了颜色(红色或黑色),红黑树满足以下 5 个性质: 1、 每个结点的颜色只能是红色或黑色。 2、 根结点是黑色的。 3、 每个叶子结点都带有两个空的黑色结点(被称为黑哨兵),如果一个结点 n 的只有一个左孩子,那么 n

JAVA中的数据结构

折月煮酒 提交于 2020-03-23 19:33:59
3 月,跳不动了?>>> 一, 红黑树所处数据结构的位置 : 在JDK源码中, 有treeMap和JDK8的HashMap都用到了红黑树去存储 红黑树可以看成B树的一种: 从二叉树看,红黑树是一颗相对平衡的二叉树 二叉树-->搜索二叉树-->平衡搜索二叉树--> 红黑树 从N阶树看,红黑树就是一颗 2-3-4树 N阶树-->B(B-)树 故我提取出了红黑树部分的源码,去说明红黑树的理解 看之前,理解红黑树的几个特性,后面的操作都是为了让树符合红黑树的这几个特性,从而满足对查找效率的O(logn) 二,红黑树特性,以及保持的手段 1,根和叶子节点都是黑色的 2,不能有有连续两个红色的节点 3, 从任一节点到它所能到达得叶子节点的所有简单路径都包含相同数目的黑色节点 这几个特效,个人理解就是规定了红黑树是一颗2-3-4的B树了,从而满足了O(logn)查找效率 保持特性的手段,通过下面这些手段,让红黑树满足红黑树的特性,如果要尝试理解,可以从2-3-4树的向上增长,后面有详细介绍 当然,这些改变也都是在O(logn)内完成的,主要改变方式有 1, 改变颜色 2, 左旋 3, 右旋 三,从JDK源码来理解 主要看我的注释,逻辑的理解 先看TreeMap //对treeMap的红黑树理解注解. 2017.02.16 by 何锦彬 JDK,1.7.51<br> <br>/** From

红黑树

时间秒杀一切 提交于 2020-03-23 19:19:42
3 月,跳不动了?>>> 红黑树的性质: 1、每个节点不是黑色就是红色 2、根节点为黑色 3、不可能有连在一起的红色节点。(每个红色节点的两个子节点都是黑色) 4、从任意节点到其每个叶子的所有路径都包含相同数目的黑色节点 5、每个叶子节点都是黑色的空节点 旋转与颜色变换规则: 变颜色:当前节点的父节点和叔节点都是红色 1、将父节点和叔节点都变为黑色 2、将祖父节点变为红色 3、当前指针定义到祖父节点 左旋:当前节点的父节点为红色,叔节点为黑色,且当前节点为父节点右子树 1、以父节点左旋 右旋:当前节点的父节点为红色,叔节点为黑色,且当前节点为父节点左子树 1、将父节点变为黑色 2、将祖父节点变为红色 3、以祖父节点右旋 来源: oschina 链接: https://my.oschina.net/u/4131998/blog/3209272

Java8 ConcurrentHashMap详解

怎甘沉沦 提交于 2020-03-23 15:38:24
#Java8 ConcurrentHashMap Java7 中实现的 ConcurrentHashMap 说实话还是比较复杂的,Java8 对 ConcurrentHashMap 进行了比较大的改动。建议读者可以参考 Java8 中 HashMap 相对于 Java7 HashMap 的改动,对于 ConcurrentHashMap,Java8 也引入了红黑树。 说实话,Java8 ConcurrentHashMap 源码真心不简单,最难的在于扩容,数据迁移操作不容易看懂。 我们先用一个示意图来描述下其结构: 结构上和 Java8 的 HashMap 基本上一样,不过它要保证线程安全性,所以在源码上确实要复杂一些。 ##初始化 // 这构造函数里,什么都不干 public ConcurrentHashMap() { } public ConcurrentHashMap(int initialCapacity) { if (initialCapacity < 0) throw new IllegalArgumentException(); int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ? MAXIMUM_CAPACITY : tableSizeFor(initialCapacity +

mysql数据库面试总结

喜你入骨 提交于 2020-03-23 04:59:04
数据库优化 建表优化 1)数据库范式 l 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 如电话列可进行拆分---家庭电话、公司电话 l 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。 l 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。 比如 Student 表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话) 这样一个表结构,就存在上述关系。 学号 --> 所在院校 --> ( 院校地址,院校电话 ) 这样的表结构,我们应该拆开来,如下。 (学号,姓名,年龄,性别,所在院校) -- (所在院校,院校地址,院校电话) 满足这些规范的数据库是简洁的、结构明晰的;同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。 2)数据类型选择 l 数字类型 Float 和 double 选择(尽量选择 float ) 区分开TINYINT / INT / BIGINT,能确定不会使用负数的字段,建议添加 unsigned定义 能够用数字类型的字段尽量选择数字类型而不用字符串类型的 l 字符类型 char,varchar,TEXT的选择:非万不得已不要使用 TEXT 数据类型,定长字段,建议使用

数据结构——树的相关概念

强颜欢笑 提交于 2020-03-21 12:58:05
平衡二叉树和二叉查找树 至多有两个子节点的树成为二叉树 1)平衡二叉树 1)树的左右高度差不能超过1. 2)任何往下递归的左子树和右子树,必须符合第一条性质 3)没有任何节点的空树或只有跟节点的树也是平衡二叉树 树的节点Node是key value的形式。因为key可能不连续,甚至不是整数,所以我们没办法使用数组来表示,这个时候我们就可以用二叉查找树来实现 2)二叉查找树 树如其名,二叉查找树非常擅长数据查找。 二叉查找树额外增加了如下要求:它的左子树上所有节点的值都小于它,而它的右子树上所有节点的值都大于它。 查找的过程从树的根节点开始,沿着简单的判断向下走,小于节点值的往左边走,大于节点值的往右边走,直到找到目标数据或者到达叶子节点还未找到。 通常设计Node节点来表示key value这样的数据对 二叉查找树的insert package bobo.algo; // 二分搜索树 // 由于Key需要能够进行比较,所以需要extends Comparable<Key> public class BST<Key extends Comparable<Key>, Value> { // 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现 private class Node { private Key key; private Value value; private

再回首数据结构—红黑树(一)

被刻印的时光 ゝ 提交于 2020-03-21 12:57:24
红黑树与AVL树一样同为二分搜索树,红黑树又称为是保持“黑平衡”的二叉树,红黑树最大高度为:2logn,红黑树由这么几个独特的特征:   1、每个节点或黑或红   2、根节点为黑色   3、每个叶子节点(最后的空节点)都为黑色   4、如果一个节点为红色,则他孩子节点全为黑色   5、从任意节点到叶子节点,经过的黑色节点为一样多的   6、所有红色节点都向左倾斜   在之前的二叉搜索树中我们在实现的节点结构中定义了用于存储元素的e、用于存放左子树的left、用于存放右子树的right等对象,而在AVL树中比二叉搜索树有所不同由于AVL需要维护左右子树的节点高度所以多了一个元素height用于存放节点的高度;   红黑树也是基于之前二叉搜索树变体而来的,在红黑树中节点也只比二叉搜索树多一个元素,二叉搜索树的节点由以下元素组成:    e : 用于存储节点元素    left: 用于存储左子树    right: 用于存储右子树    color: 用于标志节点颜色,节点是红色或黑色 红黑树的代码定义: type RBT struct { root *RBTNode size int compare Comparable } type RBTNode struct { e interface{} left *RBTNode right *RBTNode color bool }

红黑树(一)之 原理和算法详细介绍

大城市里の小女人 提交于 2020-03-21 05:47:29
概要 前面几章对红黑树进行了比较全面的介绍,包括红黑树的理论以及C/C++/Java的实现。这部分将我学习红黑树期间的一些参考资料和代码分享出来,供大家参考。 转载请注明出处: http://www.cnblogs.com/skywang12345/p/3644742.html 更多内容: 数据结构与算法系列 目录 (01) 红黑树(一)之 原理和算法详细介绍 (02) 红黑树(二)之 C语言的实现 (03) 红黑树(三)之 Linux内核中红黑树的经典实现 (04) 红黑树(四)之 C++的实现 (05) 红黑树(五)之 Java的实现 (06) 红黑树(六)之 参考资料 参考说明 在写红黑树这几篇文章的过程中,参考了许多资料:主要有 《算法导论》 、 《数据结构与算法分析-C语言描述》 以及 网上的一些文章 ;此外,还参考了" Linux内核中的红黑树源码 "、" JDK中的红黑树源码 "、" STL中的红黑树源码 "。 1. Linux内核中的红黑树源码 在" 红黑树(三)之 Linux内核中红黑树的经典实现 "这篇文章中,我已经将Linux内核中的红黑树源码移植出来了,供大家参考。若你想自己亲自研究,可以获取Linux内核源码后再进行查阅。 (01) Linux内核源码下载地址: https://www.kernel.org/ (02) 头文件路径:include

ConcurrentHashMap源码解析(1.8)

末鹿安然 提交于 2020-03-20 07:58:47
一、简介 上篇文章 详细介绍了HashMap的源码及原理,本文趁热打铁继续分析ConcurrentHashMap的原理。 首先在看本文之前,希望对HashMap有一个详细的了解。不然看直接看ConcurrentHashMap的源码还是有些费劲的。 相信对HashMap,HashTable有一定了解,应该知道HashMap是不具备线程安全性的,在resize时会丢数据(JDK8),而HashTable虽然保证了线程安全性,但是其是通过给每个方法加Synchronized关键字达到的同步目的。但是都知道Synchronized在竞争激烈的多线程并发环境中,在性能上的表现是非常不如人意的。那在高并发环境中HashMap如何保证线程安全而又不浪费太多性能呢?答案就是Java J.U.C并发包中的ConcurrentHashMap。 依然开局一张图。JDK8中的ConcurrentHashMap数据结构。 呃呵,和HashMap的结构是一样的,没错在数据结构层面,ConcurrentHashMap和HashMap是完全一样的。有了这个基础继续往下看。 二、历史版本 ConcurrentHashMap的历史版本大致分界线在JDK8。也就是可以分为JDK8和JDK8以前版本。 数据结构的区别 在JDK8之前HashMap没有引入红黑树,同样的ConcurrentHashMap也没有引入红黑树

集合框架系列 Map(十二):TreeMap(1.8)

别来无恙 提交于 2020-03-18 18:28:37
目录 一 简介 二 概览 三 源码分析  3.1 查找  3.2 遍历  3.3 插入  3.4 删除 一、简介 TreeMap 最早出现在 JDK 1.2 中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于 红黑树 实现,可保证在 log(n) 时间复杂度内完成 containsKey、get、put 和 remove 操作,效率很高。另一方面,由于 TreeMap 基于红黑树实现,这为 TreeMap 保持键的有序性打下了基础。总的来说,TreeMap 的核心是红黑树,其很多方法也是对红黑树增删查基础操作的一个包装。所以只要弄懂了红黑树,TreeMap 就没什么秘密了。 二、概览 TreeMap 继承自 AbstractMap ,并实现了 NavigableMap 接口。NavigableMap 接口继承了 SortedMap 接口,SortedMap 最终继承自 Map 接口,同时 AbstractMap 类也实现了 Map 接口。以上就是 TreeMap 的继承体系,描述起来有点乱,不如看图了: 上图就是 TreeMap 的继承体系图,比较直观。这里来简单说一下继承体系中不常见的接口 NavigableMap 和 SortedMap ,这两个接口见名知意。先说 NavigableMap 接口,NavigableMap 接口声明了一些列具有导航功能的方法