红黑树

HashMap以及源码详解

天涯浪子 提交于 2020-01-23 10:28:30
HashMap实现接口以及继承类 实现了Map,Cloneable,Serializable接口,继承自AbstractMap类。 允许 null 值和 null 键,无序,不允许重复的集合 HashMap底层结构 HashMap底层接口是哈希表,也就是所谓的散列表。 简单介绍一下散列表,散列表的出现是为了解决链表和数组的缺陷,链表增删快,查询慢,数组查询快,增删慢。而散列表基于数组和列表进行演变,使得查询和增删的速度都非常快。 散列表的结构如下。 hashMap中的散列表是用数组+链表+红黑树去实现的 。 好的散列方式,会把数据散列到不同的位置,哪怕散列到同一个位置(这就是所谓的 哈希冲突 ),我们可以把它链起来变成链表(Java采用 链地址法 ),只要这个链表足够的短,我们就可以最快的查询数据,因为遍历两三个节点的时间非常短,近似于O(1)。 当链表足够长( 链表长度 >= 8)并且,节点足够多(节点数 >= 64)的时候,我们就把当前的链表变成红黑树。 (为什么节点 >=8 才变成红黑树,<=6变成链表? 因为根据泊松分布,当节点树大于等于 8 的时候,红黑树查询会比链表查询要快,而当节点数小于等于 6 的时候,会链表查询回避红黑树要快。7的时候是相当。) HashMap常用方法以及源码解析 简单介绍以下变量以及初始值: HashMap的最大容量(MAXIMUM

HashMap源码解析(jdk1.8)

纵然是瞬间 提交于 2020-01-23 08:19:01
HashMap在开发中经常用,而且面试的时候肯定也会被问到,所以了解源码是很有必要的,能够让我们更好的使用HashMap,今天总结一下,在最后面会有相关面试题。本文不会对红黑树代码由太多深入研究,特别是删除方面太复杂,我们知道红黑树的特点和基本实现原理差不多就可以了,这里推荐先学习2-3树,然后学习红黑树就会水到渠成,然后能够手写实现红黑树就挺好的。 这里HashMap源码基于jdk1.8,我们都知道1.8版本的HashMap有很大改变,而且现在开发一般也都是使用jdk1.8+版本,HashMap底层通过数组+链表+红黑树实现,对红黑树和链表不了解可以参考: Java数据结构和算法(四)–链表 Java数据结构和算法(八)–红黑树与2-3树 HashMap数据结构: 基本结构: public class HashMap < K , V > extends AbstractMap < K , V > implements Map < K , V > , Cloneable , Serializable { private static final long serialVersionUID = 362498820763181265 L ; } 继承了AbstractMap,又实现了Map,这里算是jdk集合开发者的一个失误吧,后来证明这样写应该是没什么用的,只是一直保留下来了

红黑树并没有我们想象的那么难(下)

会有一股神秘感。 提交于 2020-01-21 17:40:19
红黑树并没有我们想象的那么难 上、下两篇已经完成, 希望能帮助到大家. 红黑树并没有我们想象的那么难(上): http://daoluan.net/blog/rbtree-is-not-difficult/ 红黑树并没有我们想象的那么难(下): http://daoluan.net/blog/rbtree-is-not-difficult-2/ SGI STL map 实现概述 根据上一节的红黑树分析, 结合 sgi stl map 的实现, 看看红黑树的源码是如何实现的. 以下主要以代码的注释为主. sgi stl map 底层实现是 _Rb_tree类, 为了方便管理, _Rb_tree 内置了 _M_header, 用于记录红黑树中的根节点, 最小节点和最大节点. 在插入删除中都会对其进行维护. 找到一副美艳的图片: 我只会展开插入和删除的代码. _Rb_tree 有 insert_unique() 和 insert_equal() 两种, 前者不允许有重复值, 后者可以. insert_unique() 判断是否有重复值的方法利用了二叉搜索树的性质. 细节请参看下面的代码. 为什么选择红黑树作为底层实现 红黑树是一种类平衡树, 但它不是高度的平衡树, 但平衡的效果已经很好了. 补充说明另一种 AVL 树, 我之前的博文: 《编程珠玑,字字珠玑》读书笔记完结篇——AVL树

linux内存管理之vmalloc函数分析

谁说胖子不能爱 提交于 2020-01-21 09:05:54
2017-07-09 今天周末,闲来无事聊聊linux内核内存分配那点事……重点在于分析vmalloc的执行 流程 以传统x86架构为例,内核空间内存(3G-4G)主要分为三大部分:DMA映射区,一致映射区、高端内存区。其中前两者占据低端892M,而剩下的128M作为高端内存区。DMA映射区涉及到外部设备,咱们暂且不讨论,那么就剩下一致映射区和高端内存区。一致映射区的虚拟地址均一一对应了物理页框,因此此区间虚拟地址的访问可以直接通过偏移量得到物理内存而不需进行页表的转换。但是1G内核地址空间说实话有些捉襟见肘,如果都用作一致映射,那么当物理内存大于4G时,内核仍然无法利用。鉴于此,留下128M的地址空间作为高端内存,扮演着临时映射的作用。回想下PAE模式的原理,是不是有些相似呢?一致映射区既然都已经关联了物理内存就可以通过slab缓存来管理,以加速分配。而高端内存这点有些类似于用户进程的内存分配,但又并不完全相同,后面咱们会讲到。在这里咱们先回忆下用户空间内存分配流程,一个普通的进程调用malloc函数分配一段地址空间,有可能在 堆中,如果内存过大海有可能在mmap映射区,同时会由一个vm_area_struct记录下本次分配出去的地址空间信息,如大小,起始地址等由于进程独享虚拟地址空间,所以这些vm_area_struct都是按照进程为单位进行管理的。这也没毛病

Java 容器 - 一文详解HashMap

扶醉桌前 提交于 2020-01-21 02:36:04
Map 类集合 Java Map类集合,与Collections类集合存在很大不同。它是与Collection 类平级的一个接口。 在集合框架中,通过部分视图方法这一根 微弱的线联系起来。 (在之后的分享中,我们会讨论到Collections 框架的内容) Map类集合中的存储单位是K-V键值对,就是 使用一定的哈希算法形成一组比较均匀的哈希值作为Key,Value值挂在Key上。 Map类 的特点: 没有重复的Key,可以具有多个重复的Value Value可以是List/Map/Set对象 KV是否允许为null,以实现类的约束为准 Map集合类 Key Value Super JDK 说明 Hashtable 不允许为 null 不允许为 null Dictionary 1.0 (过时)线程安全类 ConcurrentHashMap 不允许为 null 不允许为 null AbstractMap 1.5 锁分段技术或CAS(JDK8 及以上) TreeMap 不允许为 null 允许为 null AbstractMap 1.2 线程不安全(有序) HashMap 允许为 null 允许为 null AbstractMap 1.2 线程不安全(resize 死链问题) 从jdk1.0-1.5,这几个重点KV集合类,见证了Java语言成为工业级语言的成长历程。 知识点: Map

算法之【红黑二叉树】

社会主义新天地 提交于 2020-01-19 14:39:20
【前言】 自己整理的东西才是自己的。 【概念】 红黑树(Red Black Tree)别名:对称二叉B树, 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。 它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。 【对比其他树】 红黑树的统计性能要好于AVL树(也叫平衡二叉树,根据作者命名Adelson-Velskii和Landis,将其称为AVL-树),因此,红黑树在很多地方都有应用。 其他平衡树还有:AVL,SBT,伸展树,TREAP 等等。 来源: 51CTO 作者: Red_Ant_hoyl 链接: https://blog.51cto.com/13479739/2467811

STL中的map、set(学完红黑树后的一个小总结)

亡梦爱人 提交于 2020-01-18 03:59:05
树介绍 树是一种很常用的数据结构,在很多地方都能看到树的应用,因为树往往可以用来优化数据查找的效率。 在一些优秀的系统中就会经常用到各种树结构,比如红黑树、AVL树、B树等。 红黑树的应用: 原理: 根节点是黑色的 只有红黑节点 叶节点都是黑色的nil 红色节点子节点必须是黑色的 对每个节点,从该节点到叶子节点路径上的黑节点数目一致,黑平衡性质 以上的五个性质保证了红黑树是平衡的,所以红黑树的查找效率能够稳定在lgn STL模板库中map和set的底层实现: 红黑树中节点和迭代器的实现 所有这些优秀的底层设计都会把结构和数据分离 struct __rb_tree_node_base { typedef __rb_tree_color_type color_type; typedef __rb_tree_node_base* base_ptr; color_type color; // 红黑树的颜色 base_ptr parent; // 父节点 base_ptr left; // 左子节点 base_ptr right; // 右子节点 } template <class Value> struct __rb_tree_node : public __rb_tree_node_base { typedef __rb_tree_node<Value>* link_type;

HashMap

*爱你&永不变心* 提交于 2020-01-17 18:22:18
public class HashMap < K , V > extends AbstractMap < K , V > implements Map < K , V > , Cloneable , Serializable HashMap 继承了AbstractMap类,实现了Map,Cloneable,Serializeable三个接口。 static final int MAXIMUM_CAPACITY = 1 << 30 ; //最大容量2的30次方,因为这是整数型的最大范围 static final float DEFAULT_LOAD_FACTOR = 0.75f ; //默认负载因子为0.75 //当链表数组的容量超过初始容量的0.75时,将链表数组扩大2倍,把原链表搬移到新的数组中 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4 ; //初始容量为16 在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。 为什么是8

红黑树基本功能 —— C++实现

烂漫一生 提交于 2020-01-16 20:50:49
^ _ ^ 感谢各位大佬光临,I love You mua~ 红黑树是一种高级的数据结构 可以说红黑树是普通二叉搜索树的升级版本,可以自动平衡 此文章不对红黑树的原理进行解析,因为我太懒了~ 文章底部将会插入一些红黑树原理的一些结构图(单旋转、双旋转) 此文章将以三个 ( .h 文件 ) 和 一个 ( .cpp文件 ) 来实现红黑树: Except.h ( 异常类包含的头文件 ) Wrapper.h ( 自定义的引用类型包含的头文件 ) RedBlackTreeH.h ( 红黑树实现的头文件 ) Main.cpp ( 包含main的头文件,用来测试红黑树 ) 为了测试,所有成员都将以 public 展示 一、Except.h 实现 # pragma once # include <string> using namespace std ; class DSException // 作为异常类的基类 { public : DSEexception ( const string & msg = "" ) : message ( msg ) { } virtual ~ DSException ( ) { } virtual string toString ( ) const { return "Exception " + string ( ": " ) + what ( ) ; }

树形结构定义介绍

元气小坏坏 提交于 2020-01-16 19:51:59
B树 B-树就是B树,中间是横线不是减号。B树是一种多路平衡查找树。 B-树(Balance Tree),一个m阶的B树具有如下几个特征: 1.根结点至少有两个子女。 2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m 3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m 4.所有的叶子结点都位于同一层。 5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。 B+ 树 一个m阶的B+树具有如下几个特征: 1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。(中间节点可以存更多元素) 2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。 3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。 在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。 B+树相比B树的优势有三个: IO次数更少,中间节点不存数据可容纳更多元素 查询性能稳定,都需要定位到叶子节点 范围查询简便,叶子节点之间是有序链表 二叉查找树(BST)