红黑树、HashMap

  1. 红黑数定义:

  2. 满足下列条件的二叉搜索树是红黑树  
  3.   
  4.     * 每个结点要么是“红色”,要么是“黑色”(后面将说明)  
  5.     * 所有的叶结点都是空结点,并且是“黑色”的  
  6.     * 如果一个结点是“红色”的,那么它的两个子结点都是“黑色”的  
  7.     * (注:也就是說,如果結點是黑色的,那么它的子節點可以是紅色或者是黑色的)。  
  8.     * 结点到其子孙结点的每条简单路径都包含相同数目的“黑色”结点  
  9.     * 根结点永远是“黑色”的  
  10.   
  11. 之所以称为红黑树的原因就在于它的每个结点都被“着色”为红色或黑色。这些结点颜色被用来检测树的平衡性。但需要注意的是,红黑树并不是平衡二叉树,恰恰相反,红黑树放松了平衡二叉树的某些要求,由于一定限度的“不平衡”,红黑树的性能得到了提升。 
  12. 平衡二叉树定义:满足根节点的左右子树的深度差的绝对值不超过1的二叉树就是平衡二叉树。 


传统 HashMap 的缺点

JDK 1.8 以前 HashMap 的实现是 数组+链表,即使哈希函数取得再好,也很难达到元素百分百均匀分布。

当 HashMap 中有大量的元素都存放到同一个桶中时,这个桶下有一条长长的链表,这个时候 HashMap 就相当于一个单链表,假如单链表有 n 个元素,遍历的时间复杂度就是 O(n),完全失去了它的优势。

针对这种情况,JDK 1.8 中引入了 红黑树(查找时间复杂度为 O(logn))来优化这个问题。

HashMap 在 JDK 1.8 中新增的数据结构 – 红黑树


  1. 红黑树引入了“颜色”的概念。引入“颜色”的目的在于使得红黑树的平衡条件得以简化。正如著名的密码学专家Bruce Schneier所说的那样,“Being Partly balanced can be good enough”,红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。  
  2.   
  3. 红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高。  
  4.   
  5. 当然,红黑树并不适应所有应用树的领域。如果数据基本上是静态的,那么让他们待在他们能够插入,并且不影响平衡的地方会具有更好的性能。如果数据完全是静态的,例如,做一个哈希表,性能可能会更好一些。  
  6.   
  7. 在实际的系统中,例如,需要使用动态规则的防火墙系统,使用红黑树而不是散列表被实践证明具有更好的伸缩性。 





猜你喜欢

转载自blog.csdn.net/cdaimadada/article/details/80273822