• 浅谈红黑树


    1.红黑树简介

    红黑树是一种自平衡二叉搜索树,不能保证非常严格的平衡性,但是其平衡性仍然足以确保以O(logN)的时间复杂度进行插入、删除和检索操作。
    它需要更少的内存,并且可以更快的进行再平衡,所以它常在树需要被频繁修改的情况下使用。

    2. 红黑树性质

    1)每个节点要么是红色节点,要么是黑色节点
    2)根节点是黑色节点
    3)叶节点是空节点,也称为黑色节点
    4)每个红色节点必须有两个黑色子节点,也就是说,一个红色节点不可能有红色子节点(虽然黑色节点可以有黑色子节点)
    5)每一条从某一节点至叶节点的路径必须包含相同数量的黑色子节点

    3. 为什么这样的树是平衡的

    根据性质5)假设从某节点(根节点)到叶节点有路径1与路径2,每条路径均有b个黑色节点,最坏情况下,

    • 红色节点最少数量为0,则路径1共有b个节点
    • 红色节点最大数量为b(性质4决定红色节点数不会超过一半), 路径2共有2b个节点
      即使在最极端的情况下,两条路径的长度相差也不会超过一倍,这足以确保在O(logN)的时间复杂度内完成查找和插入操作
    4. Java8中HashMap链表使用红黑树而不是AVL树

    ConcurrentHashMap中是加了锁的,实际上是读写锁,如果写冲突就会等待,如果插入时间过长必然等待时间更长,而红黑树相对AVL树插入更快

    5. 既然红黑树那么好,为啥hashmap不直接采用红黑树,而是当大于8个的时候才转换红黑树

    因为红黑树需要左旋、右旋操作,而单链表不需要
    以下都是单链表与红黑树结构对比
    如果元素小于8个,查询成本高,新增成本低
    如果元素大于8个,查询成本低,新增成本高

    6. 红黑树应用实例

    JAVA: java.util.TreeMap、java.utils.TreeSet
    C++ STL: map、multimap、multiset
    Linux内核: 完全公平的调度程序, linux/rbtree.h

  • 相关阅读:
    LDAPWordlistHarvester:基于LDAP数据的字典生成工具
    JustAuth扩展:支持自动获得回调域名、使用redission作为Cache
    数据结构---单链表
    团队管理之性能实施团队日志10
    (十五)admin-boot项目之使用undertow来替代tomcat容器
    Linux操作文件的命令
    AOP获取通知以及实际应用
    普通莫队小结
    基于AI与物联网技术的智能视频监控系统架构剖析
    【Redis】解决Redis并发竞争key问题
  • 原文地址:https://blog.csdn.net/SJshenjian/article/details/130901217