算法导论之第十七章-平摊分析

平摊代价大意是指把总执行代价平摊到操作次数,因为虽然出现某些操作是高代价的,但是其他操作为代价较低时,平摊代价就较低了。
习题:
在这里插入图片描述
答:易得:当n=2k时,平摊代价最大。
O(n) = 1+2+1+4+1+1+1+8… = (1+2+4+…+2k)+(2k-k-1) = 3*2k -k -2;
n = 2k;
所以 O(n)/n = 3;

记账方式就是每次操作都给固定金额,如果金额有的多,就存起来,如果某次操作金额不够,就是用存款,只要保证存款不为负就行。
在这里插入图片描述
答:现在已知第2(k-1)位时,存款为m,m>=0;
从下一位开始,每位加存款2,,直至第2k位,其间新加存款2*(2(k-1)-1) = 2k-2;
第2k位使用存款2k-3,所以第2k位后,存款还剩m+1>0;
所以O(n)/n = 3成立;

势能的话,感觉和存款有些像,大意就是我这些操作都是有势能的,如果某些操作代价高,我可以利用势能来平摊
在这里插入图片描述
在这里插入图片描述
答:设置势能为Φ(i)=2*(i-2k)(k为保持Φ为非负情况下的最大值);
当不存在k,使i=2k时:
Φ(i) - Φ(i-1) = 2;
平摊代价是:c’i = ci + Φ(i) - Φ(i-1) = 1+2 = 3;
当存在k,使i=2k时:
Φ(i) - Φ(i-1) = 0 - 2*(2k - 1 - 2k-1) = 2-2k;
平摊代价是:c’i = ci + Φ(i) - Φ(i-1) = 2k + 2-2k = 2;
平摊代价都是O(1);

总结,平摊分析只是在分析复杂度,用来辅助找到更好的方式,本事并不是算法。

猜你喜欢

转载自blog.csdn.net/qq_33321609/article/details/87798716