一、什么是势能分析?
势能分析首先要有一个势能函数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)=∑x∈Sf(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).
我们对三种情况分别考虑。
LCT学习笔记
最新推荐文章于 2023-12-24 11:34:17 发布
f′(x)+f′(y)−f(x)−f(y)+1=f′(y)−f(x)+1≤f′(x)−f(x)+1
f′(x)+f′(y)+f′(z)−f(x)−f(y)−f(z)+2
(+2是为了下面方便化式子,常数而已。)
≤f′(y)+f′(z)−2f(x)+2≤2(f′(x)−f(