自顶向下伸展树

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

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

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

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

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

程序:pro.cpp
( POI2000 Promotion)

你可能感兴趣的:(ACM算法)