红黑树查询的时间复杂度

3,923 阅读2分钟

前言

关于红黑树的高度证明,看了下维基百科里面关于渐近边界的证明有点懵逼。觉得证明的过程有点曲折,不知道是翻译的缘故,还是本来就难以理解。

所以我尝试使用简单的,通俗并且易于理解的方式一步一步的推导。

正文

包含n个内部节点的红黑树的高度是O(log(n))O(log(n))

定义

  • h(v)h(v)表示以节点vv为根的子树的高度。
  • bh(v)bh(v)表示从到vv子树中任何叶子的黑色节点的数目(如果vv是黑色则不计数它,也叫做黑色高度)。

引理:以节点vv为根的子树有至少2bh(v)12^{bh(v)} - 1个内部节点。

定义和引理沿用的是wiki中的,下面会开始证明。

h(v)=0h(v) = 0的时候,表示树的高度为0,此时bh(v)=0bh(v) = 0,所以:

2bh(v)1=201=02^{bh(v)} - 1 = 2 ^ 0 - 1 = 0

然后就需要使用归纳演绎了,假设以节点vv为根的子树有至少2bh(v)12^{bh(v)} - 1内部节点,此时h(v)=kh(v) = k

那么在h(v)=k+1h(v' ) = k + 1的时候,bh(v)1=bh(v)bh(v' ) - 1 = bh(v)或者bh(v)=bh(v)bh(v' ) = bh(v),因为树的高度加一,那么黑高可能不变或者加一。

对于h(v)h(v' )树种的节点数就满足n>=2bh(v)1+2bh(v)1+1=2bh(v)+11n >= 2^{bh(v)} - 1 + 2^{bh(v)} - 1 + 1 = 2 ^ {bh(v) + 1} - 1。把bh(v)bh(v )bh(v)bh(v' )替换,结果就是n>=2bh(v)+11n >= 2 ^ {bh(v' ) + 1} - 1或者n>=2bh(v)1n >= 2 ^ {bh(v' )} - 1。n的下限取最小值的话就是 2bh(v)12 ^ {bh(v' )} - 1,然后就由k成立推导了k+1也成立,引理得证。

证明

由于红黑树的性质可以得知,红色节点必有两个黑色的子节点。也就是说存在红色节点的情况下,必存在对应的黑色子节点,而存在黑色节点的时候,没有和红色节点的必然关系。那么红黑树中的bh(root)>=h(root)2bh(root) >= \frac{h(root)} {2},再和证明了的引理结合就可以完成下面一步一步的推导了

n>=2h(root)21n >= 2^{\frac{h(root)} {2}} - 1 -> log(n+1)>=h(root)2log(n+1) >= \frac{h(root)}{2} -> h(root)<=2log(n+1)h(root) <= 2log(n+1)

最后就可以确定后红黑树中查询的时间复杂度为log(n)log(n)