势能方法
概述
势能方法(Potential Method)是摊还分析的三种方法之一。它定义一个势能函数 ,将数据结构的状态映射为一个非负实数,代表”预存的势能”。第 步操作的摊还代价等于实际代价加上势能变化。通过合理设计势能函数,可以将高代价操作的代价”分摊”到低代价操作上。
定义
势能方法(Potential Method)
设数据结构在第 次操作后的状态为 ,第 次操作的实际代价为 。定义势能函数 ,满足 (初始势能为零)。
第 次操作的摊还代价定义为:
即:摊还代价 = 实际代价 + 势能增量。
对 次操作求和:
由于 且 ,有:
因此,摊还代价的总和是实际代价总和的上界。
核心性质
| 性质 | 描述 | 备注 |
|---|---|---|
| 势能非负 | 对所有 | 保证摊还代价是实际代价的上界 |
| 初始势能为零 | 确保总摊还代价不小于总实际代价 | |
| 势能可增可减 | 操作后势能可能增加或减少 | 增加时”存钱”,减少时”花钱” |
| 灵活性 | 势能函数的设计空间大 | 比记账方法更灵活 |
势能方法的直觉
势能方法类似于物理中的势能概念:
- 当操作的实际代价低于摊还代价时,势能增加(“存入”多余的能量)
- 当操作的实际代价高于摊还代价时,势能减少(“消耗”之前存储的能量)
- 关键约束:势能永远不能为负(不能”透支”)
经典应用:动态表扩容
动态表的势能分析
动态表满时容量加倍。定义势能函数:
其中 为当前元素数, 为表容量。
- 不触发扩容的插入:
- 触发扩容的插入:… 经详细计算得
因此,每次插入的摊还代价为 。
摊还分析三种方法对比
| 方法 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|
| 聚合分析 | 直接求总代价再平均 | 最简单 | 不给出单个操作的摊还代价 |
| 记账方法 | 为操作赋予”信用” | 直观 | 信用分配需要技巧 |
| 势能方法 | 定义势能函数 | 最灵活、最强大 | 势能函数设计需要经验 |