【学习笔记】势能分析法

势能分析通过定义一个势能函数,度量数据结构的潜在能量,这些资源可以用来支付未来的高成本操作。势能的变化用于平衡操作序列的总成本,从而确保整个算法的均摊成本在合理范围内。
定义状态 \(S\) 为数据结构某个时间的状态,可以是大小、容量等,定义初态为 \(S_0\)
定义 \(\Phi{(S)}\)\(S\) 的势能函数,其需满足两个性质

  • \(\Phi{(S_0)}=0\)
  • \(\Phi{(S)}>=0\)

对于一个操作,其摊还成本 \(p=c+\Phi{(S')}-\Phi{(S)}\)
其中 \(S\) 为操作前状态, \(S'\) 是操作后状态, \(c\) 为实际操作成本,即表明摊还成本 = 实际成本 + 势能变化

\(S_i\) 是第 \(i\) 次操作后数据结构的状态,第 \(i\) 次摊还成本为 \(p_i=c_i+\Phi{(S_i)}-\Phi{(S_{i-1})}\)
则总摊还成本为 \(\sum_{i=1}^{m} p_i=\sum_{i=1}^{m} c_i+\Phi{(S_m)}-\Phi{(S_0)}\)
由于势能函数性质, \(\Phi{(S_m)}-\Phi{(S_0)}>=0\) ,所以 \(\sum_{i=1}^{m} p_i>=\sum_{i=1}^{m} c_i\)
所以 \(\sum_{i=1}^{m} p_i\) 为复杂度上界,即摊还成本是实际总成本的上界
这样我们就通过好算的摊还成本界住了实际成本,如果势能函数设计的好,即\(\Phi{(S_m)}-\Phi{(S_0)}\)很小,得到的上界会很紧,复杂度会越准确

特殊的,当 \(\Phi\) 恒为 \(0\) ,势能分析变为了聚合分析,即聚合分析是势能分析的特殊情况
既然聚合分析得到的\(\Phi{(S_m)}-\Phi{(S_0)}=0\),为什么我们不全部用聚合分析呢
是因为有的数据结构,我们很难得到其真实操作成本,而其摊还成本很好算
我们往往宁愿要一个 “稍微松一点但能算出来” 的上界,也不要一个 “最精确但根本算不出来” 的真实值。

posted @ 2026-02-11 15:36  Ming3398  阅读(13)  评论(0)    收藏  举报