红黑树

最小的k个数

匿名 (未验证) 提交于 2019-12-03 00:39:02
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4, 这道题最简单的思路就是把数组排好序,然后取前面的k个数就好了,但是这种算法的时间复杂度为O(N*logN),所以我们需要利用更快的方法来解决这个问题。 解法一:时间复杂度为O(N)的算法,只有当我们可以修改数组的时候才可以用 基于快排的思想,如果基于数组的第k个数字来调整,则使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。这样调整之后,位于数组中左边的k个数字就是最小的k个数字了(不一定是排序的),所以之后我们还需要为其排序一次。 以下为该方法的参考代码: class Solution1 { /// <summary> /// 输出一个集合,集合包含传入的数组里最小的k个数 /// </summary> /// <param name="input"> 传入的数组 </param> /// <param name="k"> 要传回的最小数的个数 </param> /// <returns> 最小数排序后的集合 </returns> public List< int > GetLeastNumbers_Solution ( int [] input, int k) { List< int > list = new List<

数据结构_红黑树

匿名 (未验证) 提交于 2019-12-03 00:36:02
红黑树也是属于一种BBST。在之前介绍的 伸展树 中,虽然实现简单,分摊复杂度低,但是最坏情况下的操作需要O(n)时间,无法适用于对单次效率敏感的场合。相反的,之前介绍的 AVL树 尽管可以保证最坏情况下的单次操作,但是要在节点中嵌入平衡因子等标识;更重要的是,删除操作之后可能需要多达O(logn)次旋转。红黑树是针对后一不足的改进。通过为节点指定颜色,合理动态调整。它可以保证:在每一次插入或删除操作之后的重平衡过程中,全树的拓扑结构更新只涉及常数个。虽然最坏情况下要涉及多达O(logn)个节点染色,但是分摊意义仅为O(1)。红黑树的“适度平衡”的标准为: 任一节点左、右子树的高度相差不过两倍。 (相比于AVL树放宽了平衡条件) 红黑树结构与定义 由红、黑两类节点组成的BST,统一的增设外部节点NULL,使之成为真二叉树(预处理),即统一的引入n+1个外部节点。 由红、黑两色节点组成的二叉搜索树若满足以下条件,即为红黑树。 1、树根始终为黑色。 2、外部节点均为黑色。 3、其余节点若为红色,则孩子节点必为黑色。(红之子、之父必黑) 4、从任一外部节点到根节点的沿途,黑节点的数目相等。(黑深度) 说明:根据上面的条件1和条件2可以得知,红节点均为内部节点,且其父节点及左、右孩子必然存在。条件3意味着红节点之父必为黑色,因此树中任一通路都不含相邻的红节点。从根节点通往任一节点的沿途

B树和B+树

匿名 (未验证) 提交于 2019-12-03 00:33:02
一、为什么要有B树? 学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢? 这个要从几个方面来说了: (1)计算机有一个 局部性原理 ,就是说,当一个数据被用到时,其附近的数据也通常会马上被使用。 (2)所以当你用 红黑树的时候,你一次只能得到一个键值的信息,而用B树,可以得到最多M-1个键值的信息 。这样来说B树当然更好了。 (3)另外一方面,同样的数据, 红黑树的阶数更大,B树更短 ,这样查找的时候当然B树更具有优势了,效率也就越高。 二、B树 对于B树,我们首先要知道它的应用,B树大量应用在数据库和文件系统当中。 B树是对二叉查找树的改进。 它的设计思想是,将相关数据尽量集中在一起,以便一次读取多个数据,减少硬盘操作次数。 B树为系统最优化大块数据的读和写操作。B树算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文件系统。 假定一个节点可以容纳100个值,那么3层的B树可以容纳100万个数据,如果换成二叉查找树,则需要20层!假定操作系统一次读取一个节点,并且根节点保留在内存中,那么B树在100万个数据中查找目标值,只需要读取两次硬盘。B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。 B树的结构: 1. 根节点至少有两个子节点 ; 2. 每个节点有M-1个key,并且以升序排列 ; 3

JDK8:HashMap源码解析:7:TreeNode类的putTreeVal方法

匿名 (未验证) 提交于 2019-12-03 00:26:01
一、概述 我们都知道,目前HashMap是采用数组+链表+红黑树的方式来存储和组织数据的。 在put数据的时候,根据键的hash值寻址到具体数组位置,如果不存在hash碰撞,那么这个位置就只存储这么一个键值对。参见: put方法分析 如果两个key的hash值相同,那么对应数组位置上就需要用链表的方式将这两个数据组织起来,当同一个位置上链表中的元素达到8个的时候,就会再将这些元素构建成一个红黑树(参见: treeifyBin方法分析 ),同时把原来的单链表结构变成了双链表结构,也就是这些元素即维持着红黑树的结构又维持着双链表的结构。当第9个相同hash值的键值对put过来时,发现该位置已经是一个树节点了,那么就会调用putTreeVal方法,将这个新的值设置到指定的key上。 二、方法解析 /** * 当存在hash碰撞的时候,且元素数量大于8个时候,就会以红黑树的方式将这些元素组织起来 * map 当前节点所在的HashMap对象 * tab 当前HashMap对象的元素数组 * h 指定key的hash值 * k 指定key * v 指定key上要写入的值 * 返回:指定key所匹配到的节点对象,针对这个对象去修改V(返回空说明创建了一个新节点) */ final TreeNode<K,V> putTreeVal(HashMap<K,V> map, Node<K,V>[]

HashMap 、HashTable、TreeMap、LinkedHashMap的对比区别

匿名 (未验证) 提交于 2019-12-03 00:22:01
1、 共同点 、 LinkedHashMap 、 HashTable 、 TreeMap 都实现了 Map 接口,用于存储键值对,根据键得到值,键是不能重复的。 2、 HashMap (1) 键可以为空 (2) 不是线程安全 如果有两个并发线程同时对 HashMap 进行修改,则会抛出异常: [java] view plain copy 如果要实现线程安全,可以采用 [java] view plain copy (3) 存储方式 KEY 放在数组的同一个单元的一个链表中。 jdk1.7及以前:数组+链表,查询的时间复杂度O(n) jdk1.8:数组+链表/红黑树,当链表的长度大于8时,链表就转换成红黑树,查询的时间复杂度变成O(logn).当扩容时,桶中的元素个数小于树的链表还原阈值(默认是6),则会将红黑树转换成链表。哈希表的最小树形化容量是64,当哈希表的容量大于这个值64时,表中的桶(大于16)才能进行树化。 红黑树是一棵平衡二叉查找树,查找、插入和删除的时间复杂度都是O(logn). 红黑树的特点: 1. 根节点是黑色 2. 叶子节点是黑色 3. 节点是黑色或红色 4. 每个红色节点的两个子节点都是黑色 5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点 (4) 关键属性 capacity 默认 16 、负载因子 loadFactor 默认 0.75 16

BTree和B+Tree详解

匿名 (未验证) 提交于 2019-12-03 00:22:01
BTree B+Tree B+ B+ B+ B balance binary B+ B+ AVLTree B-Tree B+ 二叉查找树 1 1 2 2 n n (1+2+2+3+3+3) / 6 = 2.3 2,3,5,6,7,8 ―― AVL AVL Tree) AVL 1 AVL <=1 AVL 3 1 AVL AVL LL RR LR RL LL LeftLeft “ ” Left Child Left Child 2 AVL RR RightRight “ ” Right Child Right Child 2 AVL LR LeftRight “ ” Left Child Right Child 2 AVL RL RightLeft “ ” Right Child Left Child 2 AVL AVL LL LL AVL LL RR RR LL RR LR LR RR LL LR RL RL LR LL RR RL B-Tree) B-Tree B-Tree block InnoDB https://baike.baidu.com/item/innodb/8970025?fr=aladdin InnoDB Page InnoDB 16KB innodb_page_size 4K 8K 16K MySQL mysql> show variables like

红黑树算法原理(十三)

耗尽温柔 提交于 2019-12-03 00:21:20
前言 最近断断续续花了一个礼拜的时间去看红黑树算法,关于此算法还是比较难,因为涉及到诸多场景要考虑,同时接下来我们要讲解的HashMap、TreeMap等原理都涉及到红黑树算法,所以我们不得不了解其原理,关于一些基础知识这里不再讲解,本文参考博文:《 https://www.cnblogs.com/aspirant/p/9084199.html 》,参考链接太多文字描述,看过很多关于红黑树的文章,有些越讲越懵逼,有些讲的挺好关键是不说人话(这里不是骂人哈,指的是文章讲解的还是有点抽象),在这里希望通过我个人的理解既让阅读本文的您能够充分理解其原理也能完全快速记住各种场景。 红黑树原理 红黑树是一种自平衡二进制搜索树(BST),红黑树与AVL树相比,AVL树更加平衡,但是它们可能会在插入和删除过程中引起更多旋转。因此,如果我们的应用程序涉及许多频繁的插入和删除操作,则应首选红黑树。但是,如果插入和删除操作的频率较低,而搜索操作的频率较高,则AVL树应优先于红黑树。我们需牢记红黑树的每个节点所遵循的以下规则 (1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。 (3)每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点,在算法原理中空用Nil表示,但是在面向对象语言中空都用NULL表示] (4)如果一个节点是红色的,则它的子节点必须是黑色的(注意

玩转数据结构 从入门到进阶1-12章(含源码)

匿名 (未验证) 提交于 2019-12-03 00:21:02
玩转数据结构 从入门到进阶 从数据结构基础到二叉树、红黑树、哈希表,bobo老师精心设计本课程,详细生动的为你讲解数据结构。让你面对数据结构可以学的会、玩的溜。掌握数据结构,完成从“搬砖”到“盖楼”的蜕变,就在此课。各位小伙伴不要错过! 第1章 欢迎学习《玩转数据结构》 欢迎大家学习《玩转数据结构》课程。在这个课程中,我们将从底层实现诸多数据结构,从简单,到复杂,并且探索他们的应用。在这一章,我们将来看一看数据结构的具体作用,学习数据结构的误区,学习这个课程的注意事项,和课程环境的基本搭建:) … 第2章 不要小瞧数组 数组,看似是最简单的数据结构,但是,大多数语言为我们提供的都是静态数组,如何封装一个属于我们自己的动态数组,将是这一章讨论的重点。同时,我们也将探讨泛型,复杂度分析,乃至复杂度的震荡,等相关高级话题 第3章 栈和队列 栈和队列都是极其简单的线性数据结构,其中的操作甚至都是数组操作的子集,但却在计算机科学中有着极其重要的应用。在这一章,我们就来探索栈和队列的奥秘。我们将看到使用底层数据结构搭建上层数据结构的过程,同时对于队列,我们也将改进底层结构,完成循环队列的实现。… 第4章 最基础的动态数据结构:链表 在这一章,我们将接触第一个动态数据结构:链表。我们将通过对链表的底层实现,更深入的理解对引用(或者是指针)的操作。同时,我们也将利用链表,实现栈和队列

红黑树和AVL树(平衡二叉树)的定义、特点以及两者的区别

匿名 (未验证) 提交于 2019-12-03 00:05:01
红黑树和AVL树(平衡二叉树)的定义、特点以及两者的区别 定义 性质 区别 定义 AVL树:平衡二叉树又称AVL树,是一种特殊的二叉查找树,其左右子数都是平衡二叉树,且左右子树高度差的绝对值不超过1.一句话表述为:以树中所有结点为根的树的左右子树高度差的绝对值不超过1.将二叉树上结点的左子树深度减去右子树深度称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只可能是-1、0和1.只要二叉树上有一个结点的平衡因子的绝对值大于1,该二叉树就是不平衡的。 红黑树:是一种二叉查找树,但在每个结点增加一个存储位表示结点的颜色,可以是红或者黑(非黑即红)。通过对任何一条从根到叶子的路径上各个结点着色的方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因此红黑树是一种弱平衡二叉树,相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索、插入、删除操作比较多的情况下,通常使用红黑树。 性质 红黑树的性质如下:1.每个结点非红即黑;2.根节点是黑的;3.每个叶节点(叶节点即树尾端NULL指针或NULL结点)都是黑的;4.如果一个结点是红色的,则它的子节点必须是黑色的;5.对于任何结点而言,其到叶子点树NULL指针的每条路径都包含相同数目的黑结点。 区别 区别:AVL树是高度平衡的,频繁的插入和删除,会引起频繁的rebalance,导致效率下降;红黑树不是高度平衡的,算是一种折中

hashmap原理

匿名 (未验证) 提交于 2019-12-02 23:55:01
百度首页 马明亮千里之外 java中HashMap原理?面试?你是谁,你在哪? 会java的鸭子 发布时间:18-11-3017:22 1、为什么用HashMap? HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改HashMap是非synchronized,所以HashMap很快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 。 以下是具体的put过程(JDK1.8版)1、对Key求Hash值,然后再计算下标 2、如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的Hash值相同