红黑树

红黑树

匿名 (未验证) 提交于 2019-12-02 23:49:02
红黑树是一棵 二叉搜索树 ,每个结点上增加了一个存储位来表示结点的颜色,可以是RED 或 BLACK。 通过对任何一条root->叶子 的路径上的所有节点的颜色来进行约束。 红黑树确保没有一条路径比其他路径长2倍,是近似平衡的。 性质: 1、节点要么红,要么黑; 2、根节点黑色; 3、叶节点黑; 4、如果一个节点红,那么两个子节点都是黑; 5、每个节点到所有叶子节点的路径上的黑节点数目一样; 红黑树的操作: 每一个红黑树也是一个特化的二叉查找树,因此红黑树上的只读操作与普通二叉查找树上的只读操作相同。 插入删除可能会导致不再符合红黑树的性质,恢复红黑树的性质要O(logn),效率高。 一棵含有n个节点的红黑树的高度至多为2log(n+1) .

红黑树的插入调整过程(转载)

匿名 (未验证) 提交于 2019-12-02 23:47:01
红黑树的特性: 红黑树中的每个结点包含五个域:color、key、left、right和parent。如果某结点没有一个子结点或父结点,则该结点相应的指针parent域包含值为NIL(NIL并不是空指针,后面会讲到)。把NIL视为指向红黑树的外结点(叶子)的指针,而把带关键字的结点视为红黑树的内结点。红黑树结点结构如下所示: 每个节点或为红色或为黑色。 根节点是黑色。 每个叶子节点(NIL)是黑色。 如果一个节点是候色,那么它的两个儿子都是黑色。 对每个节点,从该节点到其孙子结点的所有路径上包含相同数目的黑色节点。 如下图是一棵红黑树: 旋转 在红黑树上进行结点插入和删除操作时,会改变树的结构形状,导致结果可能不满足了红黑树的某些性质,为了保证每次插入和删除操作后,仍然能报维持红黑树的性质,需要改变树中某些结点的颜色和指针结构。其中的指针结构的改变通过旋转完成的。书中给出了两种旋转:左旋转和右旋转。如下图是旋转过程: 从图可以得出左右旋转的过程,假设对某个结点x进行左旋转,y是x的右孩子,则左旋转过程为:以x和y之间的链为“支轴”进行的,使得x的右孩子为y的左孩子,y的父节点为x的父节点,y的左孩子为x。假设对某个结点y进行右旋转,x是y的左孩子,则右旋转过程为:y的左孩子设置为x的右孩子,将x的父节点设置为y的父节点,x的右孩子设置为y。左旋转的实例如下: 插入

mysql索引数据结构

匿名 (未验证) 提交于 2019-12-02 22:06:11
什么是索引?索引就是排好序的数据结构,可以帮助我们快速的查找到数据 推荐一个网站,可以演示各种数据结构:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 图解几种数据结构: 二叉树:如果数据是单边增长的情况 那么出现的就是和链表一样的数据结构了,树高度大 红黑树:在二叉树的基础上多了树平衡,也叫二叉平衡树,不像二叉树那样极端的情况会往一个方向发展。 同样我们查找6,在二叉树中我们需要经过6个节点才能找到(1-2-3-4-5-6),红黑树中我们只需要3个节点(2-4-6),但是mysql索引的数据结构并不是红黑树,因为如果数据量大了之后,树的高度就会很大。 B树:在红黑树的基础上,每个节点可以存放多个数据 这个时候我们查找6 只需要2个节点就可以了,而且树的高度也比红黑树矮。 B+树:B树的变种 你会发现非叶子节点是会重复的,就像上面4,在叶子节点上面也出现了4,这是为什么呢?因为它需要在叶子上面存放数据。那又是怎么存放数据的呢? mysql索引为什么用B+树 首先说一点,mysql索引的数据结构就是用到的B+树。 MyISAM存储引擎索引文件和数据文件是分离的 InnoDB存储引擎 Usertab使用的Innodb存储引擎,表相关文件只有两个同样.frm文件是存放表结构数据,.ibd存放的数据和索引。

java8中的HashMap

匿名 (未验证) 提交于 2019-12-02 21:53:52
简介: HashMap:   具有很快的访问速度,但遍历顺序却是不确定的。   HashMap最多只允许一条记录的键为null,允许多条记录的值为null。   HashMap 非线程安全 ,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。   如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。 Hashtable:   Hashtable是遗留类,与HashMap类似,不同的是它承自Dictionary类,并且是 线程安全 的。   并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。   Hashtable不建议在新代码中使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap替换。 LinkedHashMap:   LinkedHashMap是HashMap的一个子类, 保存了记录的插入顺序 ,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。 TreeMap:   TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序

java之HashMap详解

匿名 (未验证) 提交于 2019-12-02 21:53:52
HashMap实现了Map接口,是一个存储键值对映射的集合,线程不安全,无序,键和值可以为null。 HashMap的底层维护着一个Entry数组,即所谓的hash表,表中元素是Entry链表的第一个节点,链表中存储的是hash冲突的元素。 Java8后Entry改名为Node,并且当链表的容量达到一定值的时候转换成红黑树 //hash表默认容量:16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4 ; // aka 16 //最大容量 static final int MAXIMUM_CAPACITY = 1 << 30 ; //装填因子,默认0.75 static final float DEFAULT_LOAD_FACTOR = 0.75 f; //将冲突链表转为红黑树的阈值 static final int TREEIFY_THRESHOLD = 8 ; //由红黑树转链表时,数节点的阈值, 小于这个阈值才能转为链表 static final int UNTREEIFY_THRESHOLD = 6 ; //能将链表转为红黑树的最小hash表容量。应该至少4倍于 TREEIFY_THRESHOLD //即只有当 冲突链表节点数大于等于8 且 hash表容量达到64时才将链表转为红黑树 static final int

【Java并发编程】23、ConcurrentHashMap原理分析(1.7和1.8版本对比)

匿名 (未验证) 提交于 2019-12-02 21:53:32
jdk 1.8版本 ConcurrentHashMap在1.8中的实现,相比于1.7的版本基本上全部都变掉了。首先,取消了Segment分段锁的数据结构,取而代之的是数组+链表(红黑树)的结构。而对于锁的粒度,调整为对每个数组元素加锁(Node)。 put的步骤大致如下: 参数校验。 若table[]未创建,则初始化。table的初始化和扩容采用CAS无锁设计,通过状态 sizeCtl 来控制线程的并发操作:U.compareAndSwapInt(this, SIZECTL, sc, -1) 当table[i]后面无节点时,直接创建Node(无锁操作)。也是通过CAS实现:return U.compareAndSwapObject(tab, ((long)i << ASHIFT) + ABASE, c, v); 如果当前正在扩容,则帮助扩容并返回最新table[]。 然后在链表或者红黑树中追加节点。此过程通过 如果是链表,遍历链表,发现相同key则替换旧值,没有发现相同key则添加到链表的末尾 如果是红黑树, 最后还回去判断是否到达阀值,如到达变为红黑树结构。使用方法:treeifyBin(tab, i); 首先定位到table[]中的i。 若table[i]存在,则继续查找。 首先比较链表头部,如果是则返回。 然后如果为红黑树,查找树。 如果不是红黑树,循环链表查找。

Map集合、散列表、红黑树介绍

匿名 (未验证) 提交于 2019-12-02 21:53:32
声明,本文用得是jdk1.8 前面已经讲了Collection的总览和剖析List集合: Collection总览 List集合就这么简单【源码剖析】 原本我是打算继续将Collection下的Set集合的,结果看了源码发现: Set集合实际上就是HashMap来构建的 ! 所以,就 先介绍Map集合、散列表和红黑树吧 ! 看这篇文章之前最好是有点数据结构的基础: Java实现单向链表 栈和队列就是这么简单 二叉树就这么简单 当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~ 前面我们学习的Collection叫做集合,它可以快速查找现有的元素。 而Map在《Core Java》中称之为-->映射.. 映射的模型图是这样的: 那为什么我们需要这种数据存储结构呢???举个例子 作为学生来说,我们是根据学号来区分不同的学生。 只要我们知道学号,就可以获取对应的学生信息 。这就是Map映射的作用! 生活中还有很多这样的例子: 只要你掏出身份证(key),那就可以证明是你自己(value) 下面我们来看看Map的源码: 简单常用的Map功能有这么一些: 下面用红色框框圈住的就是 Map值得关注的子类: 无论是Set还是Map,我们会发现都会有对应的--> Hash Set, Hash Map 首先我们也先得 回顾一下数据和链表 : 链表和数组都可以按照人们的意愿来排列元素的次序

红黑树,超强动静图详解,简单易懂

匿名 (未验证) 提交于 2019-12-02 21:52:03
红黑树,对很多童鞋来说,是既熟悉又陌生。学校中学过,只了解大概;工作中不怎么使用,但面试又是重点。每次需要查看红黑树内容时都很难以更生动形象的方式来理解其内容。没错,本文内容就是要解决这个问题,用简单的语言,搭配静图和动图(利用大脑图形记忆方式),让你对红黑树有更深入的了解和更清晰的记忆,希望小伙伴们再次遇到红黑树的问题不至于头大, 建议读该文章姿势: 打开两个页面,一个页面看图片和内容,一个页面看公式,像玩魔方一样,多玩几次就明白了 通过工具 (公众号回复「工具」―>那些可以提高效率的工具―>红黑树) 动态感受红黑树的转换过程 司令:你猜我买的这个多少钱? 我: 1000 司令: 高了 我: 500 司令: 低了: 我: 750 ...... 直到最后猜中 这样说大家应该已经猜到了是「二分查找法」,通过这个例子我想要引出的是 树 ,来看图片 程序中的树其实是我们日常看到的树的倒影,或者发挥一下想象,倒影也可以是树根 二叉查找树,Binary Search Tree 「BST」,要想了解二叉查找树,我们首先看下二叉查找树有哪些特性呢? 某节点的左子树节点值仅包含小于该节点值 某节点的右子树节点值仅包含大于该节点值 左右子树每个也必须是二叉查找树 看个图就轻松理解上面三句话的意思了: 上图,结合二叉查找树的三条约束来看,非常好,没有什么问题。再来看一个图,依旧符合上面三条约束

进程调度简要总结

被刻印的时光 ゝ 提交于 2019-12-02 20:04:21
0. 权重 进程的优先级与内核的nice值对应,nice值降低对应权重增加; 内核根据进程类型和静态优先级计算权重值; 内核不仅维护进程自身的权重,还维护调度队列的权重,当进程被加入到调度队列时,也要该进程的权重增加到队列权重中; 1. 完全公平调度延时周期 内核可以通过参数sysctl_sched_latency配置一个时间间隔,用来保证每个可运行进程在此间隔下都能至少运行一次; 控制参数sched_nr_latency控制在上述时间间隔下最大的活动进程数目;如果活动进程的数目超过该配置数,则延时间隔时间成比例的进行扩展; sysctl_sched_latency = sysctl_sched_latency * nr_running / sched_nr_latency 进程分配到的时间根据进程权重在就绪队列中权重的比例进行分配; slice = slice * se->load / rq->load 2. 周期调度器扫描 周期调度器每个HZ扫描一次,更新当前进程的运行时间,并检查当前进程的运行时间是否超过了进程分配到的运行时间,如果超过了则标记进行重新调度标记; 在系统调用返回、中断返回等时机,会检查该标记,调用注册的实际调度方法的函数(比如公平调度注册的处理函数)处理进程,并进行实际的进程上下文切换; 3. 完全公平调度红黑树 完全公平调度就绪队列将进行维护在一棵红黑树中

红黑树笔记

此生再无相见时 提交于 2019-12-02 20:03:36
摘要 本博文默认读者已经明白了二叉搜索树的插入和删除算法,熟练的掌握左右旋。本文适合掌握BiTree和AVL树的读者,但想学习红黑树的读者。 简介 ​ 红黑树(Red Black Tree) 是一种 自平衡二叉查找树 ,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来, 在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树” 。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以 在O(log n)时间内做查找,插入和删除 ,这里的n 是树中元素的数目。 性质 性质1. 节点是红色或黑色。 性质2. 根节点是黑色。 性质3. 每个叶结点(NIL)是黑色的 性质4 . 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 性质5 . 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 ——from《算法导论》P174 定义 定义1. 树中的每一个结点具有五个属性:color, key, left, right, p