均摊分析 学习笔记

原文链接www.cnblogs.com/zhouzhendong/p/JunTanFenXi.html

本文概要

1. 引入

2. 简单例子

3. 证明 splay 复杂度

4. 证明 LCT 复杂度

引入

  为什么 KMP 不能可持久化,而要用 KMP 自动机来代替?

  为什么 splay 不能可持久化,仅仅只是因为难以维护 father 指针吗?

  答案是——它们都是基于均摊分析的。

  均摊是什么?

  这里有一个容易混淆的概念:期望。

  期望是指在随机情况下,算法的每种时间复杂度乘上它发生的概率之和。

  而均摊不一样。它是指总复杂度在一个范围内,但是单次操作的复杂度并不是总复杂度除以操作数,甚至有可能接近总复杂度。

  

  本文主要部分参照陈胤伯的《均摊分析简介》改写。

简单例子

问题

  一个初始值为 0 的 k 位二进制计数器,每次加一。每次加一的运算次数为修改的位数。请问时间复杂度是什么?

证明与答案

  作为一个简单例子,自然有很多简单证法。

  例如,这个 k 位二进制数第 i 位,需要每加 $2^i$ 次才会变一次。所以所有位的变化次数之和为

$$\sum_i \frac{n}{2^i} = O(n)$$

  所以单词操作均摊 $O(1)$ 。

 

  接下来,引入一种更通用的方法——势能分析。

  定义势能函数 $\phi$ 表示定义域当前状态的一个函数。

  定义 $\phi(i)$ 为第 i 次操作后的状态的势能函数值。

  定义第 i 次操作的实际消耗时间为 $t_i$ 。

  定义第 i 次操作的均摊时间话费为 $a_i$ ,$a_i = t_i + \phi(i) - \phi(i-1) $ 。

  为了方便书写,如不加说明,则用 $\Delta phi$ 表示 $\phi(i)-\phi(i-1)$ 。

  于是我们可以用上述定义得到总时间复杂度为

$$\phi(0)-\phi(n)+\sum_{i=1}^{n} a_i$$

  

  接下来回到原先的例子:

  定义 $\phi$ 表示当前 k 位二进制数中值为 1 的位的个数,显然第 i 次操作有一个 0 变成 1,设第 i

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值