自顶向下伸展树

Splay Tree 是信息学竞赛中应用很广泛的一种平衡树。Splay在应用中的一个缺点是树的层次没有保证,比如说若顺序插入所有数据,树就变成了一条链。虽然说这样还是不影响均摊复杂度,但由于一般的实现的Insert、Splay等操作都要用到递归,故在特别设计的数据中可能会遇到递归栈溢出等不希望看到的现象。

自顶向下伸展树可以解决这个问题,在它的实现中可以做到不存在任何递归。现简析其思路:

我们的目标是将被Splay的节点通过单旋和双旋移动到根,那么只要将目标节点“上面”的部分先适当地放到一边去,等目标节点作为根暴露出来之后再将刚才放到一边的子树合并起来。

具体过程有点难以用语言描述,所以我就不描述了。

但自顶向下splay有一个致命的缺点:无法将维护size域的操作轻易地结合在程序中(事实上我认为由自顶向下的前提这是不可能做到的),也就无法实现重要的Rank操作。在需要Rank操作时,还是写Treap之类好了。

程序:pro.cpp
( POI2000 Promotion)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值