关于势能分析
可能有不少不严谨之处,太菜了请谅解。
之前对于
势能分析,就是借助势能函数,将中间过程用势能函数来刻画以得到发杂度的一个上界,这样分析出来的一般是均摊复杂度。
例如,第
即
若
一些例子:
1. 栈
维护一个栈,支持
直觉来看,复杂度是
: : :
2. 二进制加法
一个二进制数,从
定义
一次加
一次操作均摊
2.5 一些理解
- 势能分析的作用,就在于通过设计函数,把时间长的操作拼到时间短的上面。
- 由上一条的启发,我们得到一个设计函数的思路:执行时间长的操作时,势能一般是降低的,时间短的操作时反之。
,中间的代价和势能之间的相加有什么意义吗?其实这没有任何实际意义,只是我们利用其来进行一个平衡。
3. Splay
现在要设计一个势能函数,根据我们的直觉,势能函数理应与
下面记
若一
记
则一次旋转的代价为
设要旋转的节点为
- 进行一次
操作时:
- 进行
操作时:
然后进行一个神秘的放缩:
因为旋转后
因此
所以
- 进行
操作时:
又因为
因此
代换得:
- 如果
操作两次都转的是 的话, 式就不在成立,我们也很难通过放缩把那个 消掉,那复杂度就不对了。
综上,除了最后一次旋转外,其余的常数都被我们消掉了。因此一次
4. LCT
沿用对
因为
其中
对原树重链剖分,现在边有了轻重之分。
记势能函数
- 重实边切成轻实边,
增加 。 - 轻实边切成重实边,
减少 。
注意到一个点到根的路径中最多经过
这样我们就用势能分析证明了
(其实我们也顺带证明了假如说用
参考资料
本文作者:KIreteria
本文链接:https://www.cnblogs.com/11-twentythree/p/18355623
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步