摊销分析的基本问题

时间:2019-08-11 17:38:53

标签: big-o amortized-analysis

数据结构支持操作foo,以便在最坏的情况下执行n个操作foo序列需要Θ(n log n)时间。

  

a)foo操作的摊销时间是多少?

     

b)单个foo操作的实际时间有多长?

a)首先,我假设foo是O(log n)最坏的情况。 因此,摊销成本来自foo传说中最坏情况的发生频率。由于我们进一步了解,摊销在O(1)和log n

之间

b)O(log n)

这是正确的吗?在这里争论的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

a)如果n个操作花费Θ(n log n),则根据定义,foo操作的摊销时间为Θ(log n),摊销时间是所有操作的平均时间,因此您不仅仅将最坏的情况算在导致它的操作上,还要对所有其他情况进行摊销。

b)foo偶尔会花费O(n),只要不超过O(log n)倍即可。只要foo的花费不超过固定次数(即O(n log n))的次数,甚至有时甚至会花费O(1)

进行摊销分析时,您不会将最坏情况乘以操作次数,而不会乘以最坏情况实际发生的次数。

例如,采取一种策略,一次将元素推入一个向量中,但每次新元素不适合当前分配时,通过将分配的大小加倍来增加内存。每个加倍实例的费用为O(n),因为您必须复制/移动所有当前元素。但是摊销时间实际上是线性的,因为您一次复制了1个元素,一次复制了2个元素,一次复制了4个元素,依此类推:总的来说,您已经完成了log(n)的加倍,但是每一个的总成本仅为{{ 1}}。因此,即使最坏的情况是1+2+4+8+...+n = 2*n-1 = O(n),此push实现的摊销时间为O(1)