《算法导论》第十七章——摊还分析

  虽然写这个博客主要目的是为了给我自己做一个思路记忆录,但是如果你恰好点了进来,那么先对你说一声欢迎。我并不是什么大触,只是一个菜菜的学生,如果您发现了什么错误或者您对于某些地方有更好的意见,非常欢迎您的斧正!

在摊还分析中,我们求数据结构的一个操作序列中所执行的所有操作的平均时间,来评价操作的代价。

17.1聚合分析

利用聚合分析,我们证明对所有n,一个n个操作的序列最坏情况下话费的总时间为T(n)。因此在最坏情况下,每个操作的平均代价,或摊还代价为T(n)/n。

栈操作

Push(S,x):将对象x压入栈中
Pop(S):将栈S的栈顶对象弹出,并返回该对象

现在增加一个新的操作:MultiPop(S,k):删除栈S栈顶的k个对象,如果栈中对象数少于k,则将整个栈的内容全部弹出。

在这里插入图片描述

通过使用聚合操作,我们考虑整个序列的n个操作,可以得到更好的商界。实际上,虽然一个单独的MultiPop操作可能代价更高,但是在一个空栈上执行n个Push、Pop和MultiPop的操作序列,代价最多为O(n)。因为当一个对象压入栈后,最多只能弹出一次。所以,对任意的n值,任意一个由n个Push、Pop和MultiPop组成的操作序列,最多花费O(n)时间。一个操作的平均花费时间为O(n)/n=O(1)。

二进制计数器递增

在这里插入图片描述

运行的时候要通过for循环调用这个函数才能实现我们的目的。

在这里插入图片描述

17.2核算法

核算法进行摊还分析时,我们对不同操作赋予不同费用,赋予某些操作的费用可能多于或少于其实际代价。我们将赋予一个操作的费用称为它的摊还代价。但跟一个操作的摊还代价超出其实际代价时,我们将差额存入数据结构中的特定对象,存入的差额称为信用。对于后续操作中摊还代价小于实际代价的情况,信用可以用来支付差额。

必须注意保持数据结构中的总信用永远为非负值。

在这里插入图片描述

在这里插入图片描述

17.3势能法

势能法摊还分析并不将预付代价表示为数据结构中特定对象的信用,而是表示为“势能”,简称“势”,将势能释放即可用来支付未来操作的代价。

在这里插入图片描述

在这里插入图片描述

17.4动态表

虽然插入和删除操作可能会引起扩张或收缩,从而有较高的实际代价,但它们的摊还代价都是O(1)。

Table_Insert将一个数据项插入表中,它占用一个槽,即保存一个数据项的空间。
Table_Delete从表中删除一个数据项,从而释放一个槽。

非空表T的装载因子α(T):表中存储的数据项的数量/表的规模(槽的数量)。

17.4.1表扩张

在这里插入图片描述

17.4.1表扩张和收缩

理想情况下,我们希望保存两个性质:
·动态表的装载因子有一个正的常数的下界
·一个表操作的摊还代价有一个常数上界

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40851250/article/details/83689952