红黑树

Java HashMap详解

久未见 提交于 2020-02-01 00:53:40
Java HashMap详解 什么是Map? 什么是HashMap? HashMap初始化 HashMap原理 HashMap扩容 HashMap面试题 什么是Map? 要理解hashMap,首先你要知道什么是map,map是用于存储键值对(<key,value>)的集合类。在java中map是一个接口,是和collection接口同一等级的集合根接口。 map的特点:1、key是无序、唯一的; 2、value是无序不唯一的。 什么是HashMap? HashMap是用哈希表(数组+单链表)+红黑树实现的map类(JDK1.8之前是数组+单链表,JDK1.8加入了红黑树)。 红黑树实际上就是一个二叉树,只是每个节点都被标记为黑色或者红色。 HashMap初始化 Map map = new HashMap(); HashMap默认初始大小为16。大小只能是2的n次方,若强行给初始大小为非2的n次方,HashMap会自动调整为2的n次方。 HashMap的最大容量为2的30次方,传入容量过大将被这个值替换: static final int MAXIMUM_CAPACITY = 1 << 30("<<"为左移运算符,1表示十进制中的“1”,30表示十进制数字1转化为二进制后向左移动30位。在数值上等同于2的30次幂) 详解:java中int类型的长度为32位,即2的31次方

散列表

霸气de小男生 提交于 2020-01-31 16:41:24
众所周知,散列表是一种十分重要的数据结构,接下来就从各个方面分析下跟散列表相关的问题。主要解决什么是散列表,散列冲突的解决方法, 以及各种方法的优缺点。 概览图: 什么是散列表? 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构,是数组的衍生体。 散列表的用途? 也就是说,散列表通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 如何设计散列函数? 散列函数的基本要求: 散列函数计算得到的散列值是一个非负整数; 如果 key1 = key2,那 hash(key1) == hash(key2); 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2); 函数需要足够简单,复杂的函数,在计算过程中需要消耗过多的cpu资源; 该函数计算结果 需要随机并且分布均匀; 我来解释一下这三点。 其中,第一点理解起来应该没有任何问题。因为数组下标是从 0 开始的,所以散列函数生成的散列值也要是非负整数。 第二点也很好理解。相同的 key

左倾红黑树

佐手、 提交于 2020-01-31 14:07:19
普通红黑树:允许一个节点有两个红色的子节点,对应2-3-4树 左倾红黑树:一个节点只能有一个红色子节点,并且是左节点,对应2-3树 在学习完红黑树之后我完全不理解是怎么想到红黑树这一种数据结构的,所以我又去看了算法第四版,明白了当红黑二叉树是由2-3查找树(B-树)推导来的 接下来学习 红黑二叉查找树(原理、实现) 对相应知识进行总结 1. 2-3查找树 2-3查找树 2. 红黑二叉查找树 这里所探究的是左倾红黑树 红黑树就是利用标准二叉树中结点的额外信息表示2-3树,额外信息,其实就是指的(结点)链接的颜色 黑链接是2-3树中的普通链接,也是标准二叉树中的链接。 红链接是将两个2-结点,变为一个3-结点。 所以,我们只需要将3-结点还原成由红链接连接的2个2-结点,即可去掉3-结点!而对于3-结点的子结点,则分配给两个2-结点来完成。 2.1 等价定义 一个静态的红黑树:(不需要再变换的、操作完成后的) 所有红链接均为左链接 没有任何一个结点与两个红链接相连 -该树是完美黑色平衡的,即任意空结点到根结点的路径上黑链接数量相同!(黑链数目既是树的高度) ① 对于第一点,对于红黑树红链接为右链接是可以的,但是这里为了统一和美观,以及减少讨论的情况和复杂度,我们统一规定左边,也就是左倾红黑树 ② 为啥不能两个红链接相连?两个红链接相连其实就产生了4-结点,这在2-3树中是会被转化的

集合知识汇总

。_饼干妹妹 提交于 2020-01-31 11:03:42
实际开发中,经常用到的 ArrayList、LinkedList、HashMap、LinkedHashMap 等集合类,其实涵盖了很多数据结构和算法,每个类可以说都是精华,今天和大家一起来梳理一下! 一、摘要 在 Java 中,集合大致可以分为两大体系,一个是 Collection,另一个是 Map,都位于java.util包下。 Collection :主要由 List、Set、Queue 接口组成,List 代表有序、重复的集合;其中 Set 代表无序、不可重复的集合;Java 5 又增加了 Queue 体系集合,代表队列集合。 Map:则代表具有映射关系的键值对集合。 很多书籍将 List、Set、Queue、Map 等能存放元素的接口体系,也归纳为容器,因为他们可以存放元素! 集合和容器,这两者只是在概念上定义不同,比如ArrayList是一个存放数组的对象,真正用起来并不会去关心这个东西到底是集合还是容器,把东西用好才是关键! java.util.Collection下的接口和继承类关系简易结构图: https://imgconvert.csdnimg.cn

查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)

左心房为你撑大大i 提交于 2020-01-31 04:18:09
散列表 散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。 平衡二叉查找树(红黑树) 二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入、删除、查找操作时间复杂度是 O(logn)。 跳表 跳表,插入、删除、查找操作时间复杂度是 O(logn)。 散列表 vs 二叉查找树 相对散列表,二叉查找树好像并没有什么优势,那我们为什么还要用二叉查找树呢? 第一, 散列表中的数据是无序存储的 ,如果要输出有序的数据,需要先进行排序。而对于二叉查找树来说,我们只需要中序遍历,就可以在 O(n) 的时间复杂度内,输出有序的数据序列。 第二,散列表扩容耗时很多,而且当 遇到散列冲突时,性能不稳定 ,尽管二叉查找树的性能不稳定,但是在工程中,我们最常用的平衡二叉查找树的性能非常稳定,时间复杂度稳定在 O(logn)。 比如:红黑树的插入、删除、查找各种操作性能都比较稳定。对于工程应用来说,要面对各种异常情况,为了支撑这种工业级的应用,我们更倾向于这种性能稳定的平衡二叉查找树 第三,笼统地来说,尽管散列表的查找等操作的时间复杂度是常量级的,但 因为哈希冲突的存在,这个常量不一定比 logn 小 ,所以实际的查找速度可能不一定比 O(logn) 快。加上哈希函数的耗时,也不一定就比平衡二叉查找树的效率高。 第四, 散列表的构造比二叉查找树要复杂 ,需要考虑的东西很多

Java 8中的红黑树

淺唱寂寞╮ 提交于 2020-01-30 06:04:34
红黑树 红黑树是每个节点都带有颜色属性的平衡二叉查找树 ,颜色为红色或黑色。除了二叉查找树一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: (1) 节点是要么红色或要么是黑色。 (2) 根一定是黑色节点。 (3) 每个叶子结点都带有两个空的黑色结点(称之为NIL节点,它又被称为黑哨兵)。 (4) 每个红色节点的两个子节点都是黑色(或者说从每个叶子到根的所有路径上不能有两个连续的红色节点)。 (5) 从任一节点到它所能到达得叶子节点的所有简单路径都包含相同数目的黑色节点。 这些性质保证了根节点到任意叶子节点的路径长度,最多相差一半(因为路径上的黑色节点相等,差别只是不能相邻的红色节点个数),所以红黑树是一个基本平衡的二叉搜索树,它没有AVL树那么绝对平衡,但是同样的关键字组成的红黑树相比AVL旋转操作要少,而且删除操作也比 AVL 树效率更高,实际应用效果也比 AVL 树更出众。当然红黑树的具体实现也复杂的多。 黑哨兵节点的作用: 红黑树的这5个性质中,第3点是比较难理解的,但它却非常有必要。我们看上面这张图,如果不使用黑哨兵,它完全满足红黑树性质,根结点5到两个叶结点1和叶结点9路径上的黑色结点数都为3个,且没有连续红色节点。 但如果加入黑哨兵后,叶结点的个数变为 8 个黑哨兵,根结点5到这8个叶结点路径上的黑高度就不一样了,所以它并不是一棵红黑树

浅谈hashmap

穿精又带淫゛_ 提交于 2020-01-30 01:14:52
Hashmap组成 Hashmap大概由两部分组成,第一部分是:数组;第二部分是:链表或者红黑树(在jdk1.8以后当一支链表的长度超过8以后,链表要转化为红黑树),emmm大概长成这样子: 如何构建一个Hashmap? 构建一个Hashmap我们得先确定一个散列函数(下图菱形中的X%6就是一个简单地散列函数[自己定义不唯一]) 然后让数据根据散列函数运算得到对应的散列值,找到它在数组中对应的位置 将数据放入数组对应的链表/红黑树中(放在红黑树的头部比较方便) 散列碰撞 :如下图圈出来的情况—>不同的值经过散列函数后进入了同一个链表中的现象 重(chong)Hash :我们确定每个链表/红黑树中的数据量是相同的(比如30个),当一棵树中的数据超过30时,将数组的size翻倍,然后打乱所有的数据,重新根据散列函数分配数据 数据倾斜 :当散列过程中,大量的数据都被配往一棵后者几棵树中,这种数据分配不平衡的现象较数据倾斜(所以散列函数要搞的复杂一点,尽量能使数据发散的分配到所有的树中) 时间复杂度 因为数组的长度和链表的长度是一个常数,在插入/查找数据时所进行的步骤都为小于这个最大的常数,所以Hashmap的查找和插入的是将复杂度都为 O(1) 来源: CSDN 作者: 请叫我LR 链接: https://blog.csdn.net/gangsiqiu1848/article

数据结构可视化学习红黑树

烈酒焚心 提交于 2020-01-28 03:19:45
红黑树是一个很重要的数据结构,其克服了二叉查找树(BST)的不平衡问题,通过旋转和变色操作完成数据的平衡。其要满足五个条件: 1、每个节点都有个color属性,为红(red)或黑(black); 2、根节点(rootNode)的color为black; 3、所有叶子节点都为黑的的空节点(color=black,value=Null); 4、红色节点的子节点为黑色节点,即不能有连续的两个红色节点; 5、从任意节点到其每个叶子节点的路径上都包含相同个数的黑色节点。 推荐一个数据可视化网站学习红黑树增删的结构变化过程: https://www.cs.usfca.edu/~galles/visualization/RedBlack.html 来源: CSDN 作者: zzzYDL 链接: https://blog.csdn.net/zzzYDL/article/details/104007983

进程调度

时间秒杀一切 提交于 2020-01-27 09:02:21
进程调度是一个内核子系统,负责决定将哪个进程投入运行,何时运行以及运行多长的时间。它是多任务操作系统的基础。 调度相关概念 多任务操作系统 I/O消耗性与处理器消耗性 优先级 处理器时间使用比 Linux调度算法 CFS调度算法 CFS调度算法的实现 时间记账 进程选择 调度器 休眠和唤醒 抢占 上下文切换 与调度相关的系统调用 调度相关概念 多任务操作系统 在单处理器机器上,会产生多个进程同时在运行的幻觉 在多处理器机器上,会使多个进程在不同的处理器上真正同时,并行的执行。 I/O消耗性与处理器消耗性 进程可以被分为: I/O消耗型:进程大部分时间用来提交I/O请求或者是等待I/O请求,这种进程运行时间短,经常处于阻塞状态,不需要太长的时间片(比如文字编辑程序) 处理器消耗型:进程大部分时间用在执行代码上,除非被强占,否则他们一直都在不停的运行,因为它们没有太多I/O需求,希望时间片越长越好(比如视频编码程序) Linux倾向于优先调度I/O消耗性 优先级 nice值:值越低,优先级越高 实时优先级:值越高,优先级越高 处理器时间使用比 linux的CFS调度器没有直接分配时间片到进程,它是将处理器的使用比划分给了进程。进程的nice值越小,分到的处理器时间使用比例越大。 CFS调度器和一般操作系统用的时间片+优先级的方式不同,进程的抢占时机取决于新的可以运行进程 消耗了

HashMap简介

女生的网名这么多〃 提交于 2020-01-26 21:10:33
HashMap简介 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。 适用场景:读多写少,(读取多插入少) 一般场景 --》 一次写入,剩下全读。 读取速度最快的,是根据下标读数组,时间复杂度O(1) ,但是插入速度慢。 大概结构上个图: 但实际的结构构造要比这复杂的多,涉及到红黑树结构。(找了个大概的图,先了解下。) 接下来复习下几种基础结构: 数组 :采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n) 数组优缺点总结 优点: 1、按照索引查询元素速度快 2、能存储大量数据 3、按照索引遍历数组方便 缺点: 1、根据内容查找元素速度慢 2、数组的大小一经确定不能改变。 3、数组只能存储一种类型的数据 4、增加、删除元素效率慢 5、未封装任何方法,所有操作都需要用户自己定义。 线性链表 :对于链表的新增,删除等操作