我猜你已经知道如果数组中的所有条目都从0开始,并且每一步我们将计数器递增1(通过翻转0和1),那么k增量的摊余成本是O(k)。 / p>
但是,如果Array以n开头会发生什么?我认为k增量的复杂度现在可能是O(log(n)+ k),因为在开始时1的最大数量是log(n)。
有什么建议吗?
提前致谢
答案 0 :(得分:1)
你是对的。证明这一点的方法不止一种,其中一种方法具有潜在的功能。 This link(和许多其他人)解释了潜在的方法。但是,教科书通常要求潜在函数的初始值为0.让我们概括一下它不是的情况。
对于二进制计数器,计数器的潜在功能是设置为1的位数。当你增加时,你花费k + 1时间将k 1翻转为0并将0翻转为1.潜在的减少k -1。所以这个增量的摊销时间= ActualTime +(PotentialAfter-PotentialBefore)= k + 1-(k-1)= 2(常数)。
现在查看维基百科链接中的“摊销与实际时间之间的关系”部分。
TotalAmortizedTime = TotalActualTime + SumOfChangesToPotential
由于SumOfChangesToPotential是伸缩式的,因此它等于FinalPotential-InitialPotential。所以:
TotalAmortizedTime = TotalActualTime + FinalPotential-InitialPotential
给出了:
TotalActualTime = TotalAmortizedTime - FinalPotential + InitialPotential <= TotalAmortizedTime + InitialPotential
因此,正如你所说,从n开始的k个增量序列的总时间是O(log n + k)。