红黑树扩展

红黑树可以用来解决更多的问题,不仅提供search功能,还可以顺序数等功能。

扩展数据结构有以下步骤:

(1) 确定用的基础结构

(2) 确定增加的域

(3) 证明新增域的维护可以在原有基础结构上完成

(4) 给出新的操作

 

算法导论14.1-8 圆内有n条弦,且没有两条弦共享端点,使用O(nlgn)的算法找出在圆内相交弦的对数(感谢网友们的智慧)

此题的关键是使用极坐标来表示圆周上的点,一条弦可以使用起点和终点表示,即表示为角度范围(a,b),弦在圆内相交,即是角度范围(a1,b1)和(a2,b2),有关系a1<a2<b1<b2或者a2<a1<b2<b1,没有两条弦共享端点表明这n个角度范围的2n个端点互不相同。这个东西类似后续的区间树,但用区间树的方法却无法解决此问题,而且必须关注互不相同这个条件,否则结论不成立。

使用构造法证明,步骤如下:

(1) 将这n个角度范围的2n个端点排序,算法时间复杂度为O(nlgn)

(2) 初始化一个空的红黑树

(3) 遍历这2n个端点,如果某端点为弦起点,将这条弦加入红黑树;如果某端点为弦终点,则这条弦必定已经加入到红黑树中,设其起点为a,查找红黑树中key值大于a的数目,这些弦必定与当前弦相交;然后删除当前弦

(4) 遍历完2n个端点后,红黑树为空,输出所有相交弦的对数

 

证明的原理,使用扩展的红黑树存储这n条弦,弦起点为红黑树的key,扩展域为当前子树的结点数;步骤3中,当端点为弦终点时,当前弦的终点为未处理弦的最小值(因为处理一条弦后就会将其删除),在红黑树中起点比当前弦起点大的必定和当前弦相交,比当前弦起点小的必定包含当前弦,所以查找红黑树中key值大于a的数目即为和当前弦相交的弦条数。

当前弦处理完毕后必需删除,必须要确保当前弦的终点为未处理弦的最小值。同时与当前弦相交的所有条数已经计算过了,也可以删除。 

 

算法导论14.2-3 结点深度是否可以在原有红黑树基础上有效维护?

不行,因为旋转操作时,可能需要改变某个子树的所有结点,其时间复杂度为O(n)

 

算法导论14.2-4结点新增域由满足结合律的操作符获得,在旋转操作下维护时间为O(1)

注意操作符满足结合律且作用到以当前结点为根的子树的中序遍历的所有结点,在旋转操作时,均是以子树为单位操作的,所以修改结点的域值可以通过O(1)时间得到

 

算法导论14.2-5 RB_ENUMERATE 复杂度为O(m+lgn)

这个题和12.2-8 完全相同,只要在O(lgn)的情况下找到最小结点,然后使用m次后继操作,每次操作判断下是否越过最大值即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值