势能方法

概述

势能方法(Potential Method)是摊还分析的三种方法之一。它定义一个势能函数 ,将数据结构的状态映射为一个非负实数,代表”预存的势能”。第 步操作的摊还代价等于实际代价加上势能变化。通过合理设计势能函数,可以将高代价操作的代价”分摊”到低代价操作上。

定义

势能方法(Potential Method)

设数据结构在第 次操作后的状态为 ,第 次操作的实际代价为 。定义势能函数 ,满足 (初始势能为零)。

次操作的摊还代价定义为:

即:摊还代价 = 实际代价 + 势能增量。

次操作求和:

由于 ,有:

因此,摊还代价的总和是实际代价总和的上界

核心性质

性质描述备注
势能非负 对所有 保证摊还代价是实际代价的上界
初始势能为零确保总摊还代价不小于总实际代价
势能可增可减操作后势能可能增加或减少增加时”存钱”,减少时”花钱”
灵活性势能函数的设计空间大比记账方法更灵活

势能方法的直觉

势能方法类似于物理中的势能概念:

  • 当操作的实际代价低于摊还代价时,势能增加(“存入”多余的能量)
  • 当操作的实际代价高于摊还代价时,势能减少(“消耗”之前存储的能量)
  • 关键约束:势能永远不能为负(不能”透支”)

经典应用:动态表扩容

动态表的势能分析

动态表满时容量加倍。定义势能函数:

其中 为当前元素数, 为表容量。

  • 不触发扩容的插入
  • 触发扩容的插入… 经详细计算得

因此,每次插入的摊还代价为

摊还分析三种方法对比

方法核心思想优点缺点
聚合分析直接求总代价再平均最简单不给出单个操作的摊还代价
记账方法为操作赋予”信用”直观信用分配需要技巧
势能方法定义势能函数最灵活、最强大势能函数设计需要经验

参见