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

    在查找中,虽然hash表查找非常迅速,但是随着数据的种类增多,
    hash表长会变得更长,且冲突也会越来越多,那么如何能实现无论在
    多大数据量的情况下,查找依然是高性能的呢?

       在1978年,Leo J.Guibas 与 Robert Sedgewick写了一篇论文中
    谈到了一种较好的用于查找的数据结构----红黑树

         一般来说,树是很好的一种数据结构,那用于插入,删除,查找等
    都是很高效的数据树构,但问题是在很坏的情况下,操作很费时间,它的
    性能得到不保证,比如二叉查找树中如果左子树与右子树相差太远,那么查找
    时就很费时间。这时为了保证其有高效性,就得保证左树与右树不能差得太远,
    当向树中插入时,就按一定规则调整,使其达到规则,从而使其整体与局部
    查找效率得到提高。这就是红黑树的规则.

       这些规则是
    在二叉查找树的基础上,

    1、每个结点或是红色的,或是黑色的。

    2、根结点是黑色的。

    3、每个叶结点(NIL)是黑色的。

    4、如果一个结点是红色的,则它的两个子结点都是黑色的。

    5、对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。

    关键的是(4), (5)它使得树是局部是平衡的,并且每条路线不会太长。

       还有一个重要的点就是,为了研究方便,会在红黑树补成两个子树是完整的,
    它们也有颜色,是黑色,但是没有数据,它称为nil叶子,null叶子。当搜索时
    发现结点与nil叶子相 等时,则是找到了叶子了。

      另外,关于红黑树与平衡二叉树的区别,它们的区别在概念上也有,
    但是在性能上也有,平衡二叉树也是在最坏的情况下有高效的,但是它
    追求整体的平衡,使得调整树时,会要很长的时间复杂度,而红黑树是
    局部平衡,调整时只要0(logn)颜色变量,并且调整不超过三次。

    红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出两倍,因而是近似于平衡的。树的每个结点有5个属性:color, key, left, right, p(指向父结点).

     红黑树是局部平衡的二叉树,但不是平衡二叉树。

  • 相关阅读:
    OpenJ_Bailian
    Codeforces Global Round 2: D.Frets On Fire
    Gym 102035 NWU2019组队赛2.0
    Gym 102035H :Zuhair and the Dag
    Gym 102035E:New Max
    Gym
    Linux常用命令-总结
    Linux常用命令
    Linux常用命令
    分布式会话 拦截器 单点登录
  • 原文地址:https://www.cnblogs.com/yyxayz/p/4065803.html
Copyright © 2011-2022 走看看