数据结构支持操作foo,以便在最坏的情况下执行n个操作foo序列需要Θ(n log n)时间。
a)foo操作的摊销时间是多少?
b)单个foo操作的实际时间有多长?
a)首先,我假设foo是O(log n)最坏的情况。 因此,摊销成本来自foo传说中最坏情况的发生频率。由于我们进一步了解,摊销在O(1)和log n
之间b)O(log n)
这是正确的吗?在这里争论的正确方法是什么?
答案 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)
。