首页 > 其他分享 >hashmap怎么解决哈希冲突问题?红黑树和AVL树有何区别?

hashmap怎么解决哈希冲突问题?红黑树和AVL树有何区别?

时间:2023-05-28 17:04:20浏览次数:35  
标签:黑树 链表 hashmap AVL 查找 红黑树 树有何 节点


链地址法

hashmap是一种基于数组和链表(或红黑树)的数据结构,它可以通过hash函数将任意长度的键映射到一个固定长度的索引,从而实现快速的存取操作。但是,由于hash函数的结果是有限的,而键的数量是无限的,所以可能存在不同的键映射到同一个索引的情况,这就叫做哈希冲突。为了解决哈希冲突,hashmap采用了链地址法,也就是把发生冲突的键值对以单向链表的形式存储在数组的同一个位置上,这样就形成了一个“拉链式”的结构。
在JDK1.8中,为了提高查找效率,当链表的长度达到一定阈值(默认为8)时,会把链表转换为红黑树,这是一种自平衡的二叉查找树,它可以保证查找时间复杂度为O(logn)。所以,hashmap解决哈希冲突的方法有两种:链表红黑树

红黑树的特点

红黑树是一种自平衡的二叉查找树,它有以下几个特点:

  • 节点分为红色或者黑色。
  • 根节点必为黑色。
  • 叶子节点都为黑色,且为 null。
  • 连接红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点)。
  • 从任意节点出发,到其每个叶子节点的路径中包含相同数量的黑色节点。
  • 新加入到红黑树的节点为红色。这些特点保证了红黑树的查找、插入、删除操作的时间复杂度都是 O(logn)。另外,红黑树还有一个特点是,从根节点到叶子节点的最长路径不大于最短路径的 2 倍。这是因为红黑树不会出现相连的红色节点,而且从任意节点到叶子节点的黑色节点数量是一样的,所以最长路径就是由红色和黑色节点交替组成的,而最短路径就是由纯黑色节点组成的。

红黑树和AVL树的区别

红黑树和AVL树都是自平衡的二叉查找树,它们有以下几个区别:

  • AVL树是严格的平衡二叉树,它要求每个节点的左右子树高度差的绝对值不超过1,因此它的高度大约是log(n)。红黑树是弱平衡二叉树,它要求每个节点到其所有叶子节点的最长路径不超过最短路径的两倍,因此它的高度大约是2log(n)。
  • AVL树在插入和删除时需要进行更多的旋转操作来维持平衡,而红黑树只需要少量的旋转和变色操作。因此,红黑树在插入和删除时更快,而AVL树在查找时更快。
  • AVL树需要额外的两位来存储每个节点的平衡因子,而红黑树只需要额外的一位来存储每个节点的颜色。因此,红黑树在空间上更节省。
  • AVL树和红黑树都有广泛的应用场景。AVL树适合用于查找频繁而插入删除少的情况,比如Windows内核中对进程地址空间的管理。红黑树适合用于插入删除频繁而查找较少的情况,比如C++ STL中的map和set,Java中的TreeMap,Linux中的进程调度器和epoll机制等。


标签:黑树,链表,hashmap,AVL,查找,红黑树,树有何,节点
From: https://blog.51cto.com/zhangxueliang/6365535

相关文章

  • java中HashMap的实现原理
    HashMap是Java中常用的一种存储结构,它通过哈希表实现了快速查找数据的功能,下面是它的具体实现原理:HashMap内部存储结构HashMap的内部实现是一个数组和一个链表组成的。数组称为哈希表,用于保存实际存储的数据,链表则用于处理哈希冲突,即不同的键值对可能会被存储到哈希表的同一个位置......
  • 理解ConcurrentHashMap的多线程执行
    理解ConcurrentHashMap的多线程执行多线程下ConcurrentMap单个操作的顺序性/原子性结论:ConcurrentHashMap单个操作,例如get/put/remove都有原子性,即使操作同一个key,在底层会通过synchronized锁去排队执行。所以多线程下,任意的执行结果都是合理的。lab1:三个线程,操作同一个Concur......
  • 1066 Root of AVL Tree
    题目:AnAVLtreeisaself-balancingbinarysearchtree.InanAVLtree,theheightsofthetwochildsubtreesofanynodedifferbyatmostone;ifatanytimetheydifferbymorethanone,rebalancingisdonetorestorethisproperty.Figures1-4illustr......
  • 千万级的数据用hashmap存储需要考虑哪些问题?
    答案:一般会预先初始化一个大容量的map解释hashmap默认初始化容量为16,在不断添加key-value时,使用率达到75%会触发扩容,此时hashmap容量会增大一倍,同时会进行key-value的拷贝及重新计算hash映射,当map中存储的key-value越来越多时扩容将导致内存溢出,所以要存储上百万或千万数据时一......
  • 万字长文之HashMap源码解析(包含红黑树)
    〇、储备知识之红黑树0.1>2-3树红黑树是一种自平衡的二叉树,它可以避免二分搜索树在极端的情况下蜕化成链表的情况。那么什么是红黑树呢?要想便于了解红黑树,我们先了解一下跟它息息相关的2-3树。2-3树是一种绝对平衡的多叉树,在这棵树中,任意一个节点,它的左右子树的高度是相同的。如下......
  • 为什么 HashMap 会死循环?
    HashMap死循环发生在JDK1.8之前的版本中,它是指在并发环境下,因为多个线程同时进行put操作,导致链表形成环形数据结构,一旦形成环形数据结构,在get(key)的时候就会产生死循环。如下图所示:死循环原因HashMap导致死循环的原因是由以下条件共同导致的:HashMap使用头插法进......
  • ConcurrentHashMap 相关
    为什么ConcurrentHashMap要放弃分段锁?答:1、因为在JDK7中 Segment 继承了重入锁ReentrantLock。在每个 Segment 在增长的时候,这时候锁的粒度也会在不断的增长。每个锁控制的是一段,当分段很多,并且加锁的分段不连续的时候,内存空间的浪费比较严重。在并发操作中,因为分段锁的......
  • LinkedHashMap
    com.google.gson.JsonArray用里面元素的id为key元素JsonObject为value且要记下每个元素本来的位置,用java集合实现:可以使用LinkedHashMap来实现这个需求。LinkedHashMap是基于哈希表实现的Map,但是同时维护一个插入顺序链表,可以保证元素的顺序与插入的顺序一致。同时,将每个元素的......
  • 14、HashMap(下)
    内容来自王争Java编程之美上一节,我们介绍了HashMap的底层实现原理,其中提到2个特殊的值,一个是链表树化阈值8,另一个是默认装载因子0.75,本节我们就继续深入分析一下这两个特殊值的由来1、默认装载因子上一节中,我们讲到,装载因子的默认值为0.75,那么0.75这个值是从何而......
  • HashMap中put源码分析
    1.对HashMap插入的元素先对key进行hash计算,然后根据得到的hash值和数组长度-1做&运算得到数组下标。2.如果下标位置没有元素,就直接插入,插入结束。3.如果下标位置有元素,就执行equals值是否相同,不同就和数组元素组成链表,插入到链表末尾,相同就会直接替换。插入结束。4.如果链表的......