伸展树(splay)

来源:互联网 发布:战地2 for mac 百度云 编辑:程序博客网 时间:2024/06/06 04:58

Preface

首先呢,这是一棵二叉排序树。
然后呢,它还要是平衡的。
诸如RBT,SBT,Treap等等都可以的。
splay是理解和实现都比较简单,平均效率也比较好的一种。
但是splay的复杂度比较的玄学(这个待会会讲)

Text

一棵二叉排序树,左子树小于当前点,右子树大于当前点。
在不断删点加点的时候,我们需要用某些算法重构这棵树,使其达到相对的“平衡”,即使最大深度尽量小,这样每次复杂度就能达到O(logN)。

splay的核心思想就是旋转。
这里写图片描述

旋转即当前点移到它的父亲的位置,然后相应的变换。图中左到右的就是x旋转到f,右图相反。

核心操作splay即将某一个点旋转到某一个点下面(转到根就是0之类的)

但是有一种情况,就是三个点连在一起并且同一方向,旋最下面的,要先将中间的旋转,再旋下面的。
单点操作splay到根直接做。

对于区间[x,y],只需要想办法将这个区间提取出来。

只需要将x-1转到根,y+1转到根下,那么y+1的左子树就是这个区间了。

修改就打上标记,在向下查找的时候顺便下传即可。

分析复杂度。
实际上通过它的原理可以发现,事实上一次操作最坏是O(N)的。
但是因为我们有旋转操作,在不断旋转中整棵树就渐渐平衡,具体严谨证明可以参考网上其他的资料,我这蒟蒻也不会。
总的来讲,它的均摊复杂度是O(Nlog N)的

0 0
原创粉丝点击