用循环不变式证明RB-DELETE-FIXUP的正确性

 初始化:在循环的第一次迭代之前,我们从一颗正常的红黑树开始,并删除了一个黑色结点y

这样在调用RB-DELETE-FIXUP之前,有:

a)性质1)和性质3)成立。

b)所有经过x结点路径的黑高度是相等的,并且会比所有不经过x的路径的黑高度少1(除非所有路径都经过x)。

 

可能违反3个性质:

l  如果y是根结点,而y的唯一的一个红色孩子成为新的根(可以证明,y最多只有一个不是nil[T]的孩子),则性质2)被违反;

l  如果xp[y]都是红色,那么性质4)被违反;

l  删除y会直接导致性质5)被违反,所有经过x的路径黑结点的高度会比所有不经过x的路径的黑高度少1

 

 红黑树删除的修正

 

保持:在while循环中需要考虑8种情况,但后面4种与前面4种是对称的,所以只讨论前面4种情况。

 

进入循环的条件是x的颜色是黑色,并且x不是根结点。因此性质4)并不被违反(性质4)只在x是红结点才有可能被违反)

 

循环的目标是:

x向根结点方向推进,保持经过x结点的黑高度相等,并且比不经过x结点的黑高度少1,直到x是红结点或者x是根结点情况出现。

 

对于x是其父结点的左孩子时,需要讨论4种情况:

 

情况1):x的兄弟w是红色的

如图中(a)的情况,经过修改颜色和左旋处理后,x的父结点被改成红色,对于性质5)的违反继续保持。这样问题转换成情况2)、3)、4)。

并且有:

a)性质1),性质3)和性质4)得以保持。

b)所有经过x结点路径的黑高度是相等的。

对情况1)的调用不会使循环终止。

 

情况2):x的兄弟w是黑色的,并且w的两个孩子都是黑色的

如图中(b)的情况,通过修改w的颜色为红色,局部修正了对性质5)的违反,这样沿着B结点的所有路径的黑高度都是相等的,但是比所有不经过B结点的的路径上的黑高度仍然少1,因此将x设置为B结点后,

有:

a)性质1)和性质3)得以保持。

b)所有经过x结点路径的黑高度是相等的,并且会比所有不经过x的路径的黑高度少1(除非所有路径都经过x)。

如果x是红色,则性质4)被违反。如果出现这种情况,循环将终止。

 

情况3):x的兄弟w是黑色的,w的左孩子是红色的,右孩子是黑色的

如图中(c)的情况,通过对颜色的修改,并对w做右旋操作,使得情况3)转换成情况4),

并且有:

a)性质1),性质3)和性质4)得以保持。

b)所有经过x结点路径的黑高度是相等的,并且会比所有不经过x的路径的黑高度少1(除非所有路径都经过x)。

对情况3)的调用不会使循环终止。

 

情况4):x的兄弟w是黑色的,w的右孩子是红色的

如图中(d)的情况,通过修改颜色和左旋,实际达到的效果是给经过原来x结点的路径上加了一个黑色结点,并且其他路径上的黑高度不变,这样就彻底修正了性质5),因此最后将x设置为根,以便退出循环。

因为x是黑色结点,且在进入情况4)之前,没有违反性质4),因此在进行变换后,性质4)也得以保持。

这样在调用完情况4)后,有:

a)性质1)和性质3)和性质4)得以保持。

b)所有经过x结点路径的黑高度是相等的。

c)性质5)被修正。

 

终止:循环终止条件是x是红色,或者x是根。

分几种情况讨论:

1):对于初始化时x结点是红色情况,循环直接终止,直接把x结点的颜色标记为黑色,这样在RB-DELETE-FIXUP调用结束后,修正了性质4)(如果p[y]是红色)和性质5)(把经过x的路径的黑结点高度加1)。性质2)也被修正(xy唯一的红色孩子,x被着成黑色,性质2)被修正)。

 

2):对于初始化时x结点是根时,循环直接终止,如果x结点是红色,根据前面的讨论,在RB-DELETE-FIXUP调用结束后,所有的红黑树的性质都成立。如果x结点是黑色,性质2)和4)显然都满足。对于这种情况,其实只有y是根结点,且是唯一结点时才会出现(否则在结点删除前红黑树性质就无法满足),这样删除后,红黑树没有内结点,nil[T]为根,性质5)显然满足。因此,所有的红黑树的性质都成立。

 

3):如果从情况2)退出循环,那么性质4)被违反,但设置x为黑色,可以修正性质4)。并且,使所有经过x的路径上的黑高度加1,与所有不经过x的路径的黑高度相同,所以性质5)被修正。如果x是根结点,则因为x被设置为黑色,性质2)也被修正,因此所有红黑树的性质都满足。

 

4):如果从情况4)退出循环,在循环终止前,性质1),3),4)和5)已经被满足。性质2)有可能不满足,但因为x最后会被设置为黑色,性质2)一定满足,因此所有红黑树的性质都满足。

 

这样,我们就用循环不变式证明了红黑树删除修正算法的正确性。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值