LCT学习笔记

本文介绍了势能分析的概念及其在LCT(Link Cut Tree)和Splay树中的应用。通过设置势能函数F(S),确保每次操作的实际代价加上势能变化不超过良性的G(n)函数。在分析Splay的时间复杂度时,选择了F(S)=∑x∈S f(x),其中f(x)=log(s(x)),s(x)是x为根的Splay子树的大小。Splay的操作策略是通过旋转将节点x移动到根位置,通过双旋可以优化常数因子。文章探讨了旋转前后势能变化的三种情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是势能分析?
势能分析首先要有一个势能函数F(S),S是一个数据结构集合,是你要分析的所有数据结构的集合,比如说你要分析一坨splay/lct森林的时间复杂度,那么f就是splay/lct森林的势能函数,而不仅仅是一棵splay/lct,虽然它也可以是。
对于每一次操作,我们进行这样的放缩:实际运行代价+势能改变量 ≤G(n)(n=|S|)。G(n)是一个比较良性的函数。那么我们把所有操作的此式加起来,就有:总运行代价+总势能改变量≤每一次操作的G(n)之和。那么就有总运行代价≤每一次操作的G(n)之和-总势能改变量≤每一操作的G(n)之和的上界-总势能改变量的下界。
二、如何分析splay的时间复杂度?
我们令 F(S)=xSf(x),f(x)=logs(x) ,s(x)=以x为根的splay子树的大小。为什么要设这个函数呢?我感觉最主要的原因就是我们希望它的时间复杂度是logn的,其次是对加减操作套以log会让它更易于放缩。
splay的工作方式是当你splay x的时候,检查x的父亲是否是根,如果是的话就把x旋到根;否则的话就看旋转x的父亲和旋转x的方向是否一致,一致的话就先旋x的父亲再选x,否则就旋两次x。
为什么要这么做呢?实际上是因为如果双旋的话操作代价的常数因子是可以被放缩掉的。根据上文所述,我们需要考虑的是每一次旋转的势能改变量+1(大小没有关系,只是表示它是个常数)。
设一次旋转后的f(x)为f’(x),旋转前的还叫f(x).
我们对三种情况分别考虑。
zig or zag

f(x)+f(y)f(x)f(y)+1=f(y)f(x)+1f(x)f(x)+1

zigzag
f(x)+f(y)+f(z)f(x)f(y)f(z)+2
(+2是为了下面方便化式子,常数而已。)
f(y)+f(z)2f(x)+22(f(x)f(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值