伸展树(splay)

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值