三种平摊分析的方法分别为_平摊分析(算法导论)

在平摊分析中,势能方法(potential method)不是将已预付的工作作为存在数据结构特定对象中存款来表示,而是表示成一 种“势能”或“势”,它在需要时可以释放出来,以支付后面的操作。势是与整个数据结构而不是其中的个别对象发生联系的。

对一个初始数据结构D0 执行n个操作。对每个i,设ci为每个操作的实际代价,Di 为对数据结构Di-1执行第i个操作的结果. 势函数Φ 将每个数据结构Di 映射为一个实数Φ(Di), 即与Di相联系的势. 第i个操作的平摊代价ai根据势函数Φ 定义为

ai = ci + Φ(Di) - Φ(Di-1)

每个操作的平摊代价为其实际代价ci加上由于该操作所增加的势。

n个操作的总的平摊代价为

∑ai = ∑ci +Φ(Dn) - Φ(D0)

如果我们能定义一个势函数Φ使得对所有n,有Φ(Dn) ≥ Φ(D0), 则总的平摊代价∑ai就是总的实际代价∑ci的一个上界。通常为了方便起见定义Φ(D0) = 0。

直观上看,如果第i个操作的势差Φ(Di) - Φ(Di-1)是正的,则平摊代价ai表示对第i个操作多收了费,同时数据结构的势也随之增加了。如果势差是负值,则平摊代价就表示对第i个操作的不足收费,这是通过减少势来支付该操作的实际代价。

平摊代价依赖于所选择的势函数Φ。不同的势函数可能会产生不同的平摊代价,但它们都是实际代价的上界。最佳势函数的选择取决于所需的时间界。

例子:栈操作 定义栈上的势函数Φ为栈中对象的个数。开始时要处理的空栈D0,且Φ(D0)=0。因为栈中的对象数始终时非负的,故在第i个操作后,栈Di就具有非负的势。 以Φ表示的n个操作的平摊代价的总和就表示了总的实际代价的一个上界。 现在计算各个操作的平摊代价。 如果作用于一个包含s个对象的栈上的第i个操作是PUSH: 则势差为Φ(Di) - Φ(Di-1) = (s+1) – s = 1 这个PUSH操作的平摊代价为ai = ci + Φ(Di) - Φ(Di-1) = 1+1=2 假设栈上的第i个操作是MULTIPOP(S, k). 该操作的实际代价为min(s, k). 势差为Φ(Di) - Φ(Di-1) = - min(s, k) 因此MULTIPOP操作的平摊代价为 ai = ci + Φ(Di) - Φ(Di-1) = min(s, k) - min(s, k) = 0 类似POP操作的平摊代价也是0。 三中栈操作的每一种的平摊代价都是O(1), 这样包含n个操作的序列的总平摊代价就是O(n)。已经证明n个操作的平摊代价的总和是总的实际代价的一个上界。所以n个操作的最坏情况代价为O(n).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值