zoukankan      html  css  js  c++  java
  • 红黑树

    一: 红黑树(RB-Tree)概念

             也是二叉查找树,我们知道,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态。现在在脑海想下怎么实现?是不是太多情景需要考虑了?好吧,我们先来看下红黑树的定义和一些基本性质。

             红黑树定义和性质
             红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:
             性质1:每个节点要么是黑色,要么是红色。
             性质2:根节点是黑色。
             性质3:每个叶子节点(NIL)是黑色。
             性质4:每个红色结点的两个子结点一定都是黑色。
             性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

             如下图 1到10依次插入红黑树后

             

              红黑树这种平衡为黑色完美平衡。

    二:红黑树和AVL树区别   

                     1.红黑树不追求完全平衡,只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。

                     2.插入节点导致树失衡的情况, AVL和RB-Tree都是最多两次树旋转来实现复衡rebalance,旋转的量级是O(1)。

                     3.删除节点导致失衡,AVL需要维护从被删除节点到根节点root这条路径上所有节点的平衡,旋转的量级为O(logN),而RB-Tree最多只需要旋转3次实现复衡,只需O(1),所以说RB-Tree删除节点的rebalance的效率更高,开销更小!

                     4.AVL的结构相较于RB-Tree更为平衡,插入和删除引起失衡,RB-Tree复衡效率更高;当然,由于AVL高度平衡,因此AVL的Search效率更高,针对插入和删除节点导致失衡后的rebalance操作,红黑树能够提供一个比较便宜的解决方案,降低开销,是对search,insert ,以及delete效率的折衷,总体来说,RB-Tree的统计性能高于AVL.

                     故引入RB-Tree是功能、性能、空间开销的折中结果。

    三:红黑树动态图

         

    四:Java8中HashMap用红黑树而不是AVL树

                     红黑树牺牲了一些查找性能 但其本身并不是完全平衡的二叉树。因此插入删除操作效率略高于AVL树,AVL树用于自平衡的计算牺牲了插入删除性能,但是因为最多只有一层的高度差,查询效率会高一些。
                     红黑树的查询性能略微逊色于AVL树,因为其比AVL树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的AVL树最多多一次比较,但是,红黑树在插入和删除上优于AVL树,AVL树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于AVL树为了维持平衡的开销要小得多
                     实际应用中,若搜索的次数远远大于插入和删除,那么选择AVL,如果搜索,插入删除次数几乎差不多,应该选择RB(红黑树)

  • 相关阅读:
    ASP.NET Core 发布 centos7 配置守护进程
    AutoMapper在asp.netcore中的使用
    git忽略文件并删除git仓库中的文件
    Animate.css 一款牛逼的css3动画库
    URL中特殊符号的处理
    efcore 配置链接sqlserver
    简单抓取小程序大全,并展示。
    UEditor上传图片到七牛C#(后端实现)
    软件项目管理三国启示录01 群雄争霸之项目经理的自我修养
    【调侃】IOC前世今生
  • 原文地址:https://www.cnblogs.com/dyg0826/p/11187081.html
Copyright © 2011-2022 走看看