【问题标题】:Binary Counter Amortized Analysis二进制计数器摊销分析
【发布时间】:2012-10-22 21:36:17
【问题描述】:

我猜你已经知道,如果数组中的所有条目都从 0 开始,并且在每一步我们将计数器增加 1(通过翻转 0 和 1),那么 k 增量的摊销成本为 O(k)。

但是,如果数组以 n 开头会发生什么?我认为 k 增量的复杂度现在可能是 O(log(n) + k),因为在开始时 1 的最大数量是 log(n)。

有什么建议吗?

提前致谢

【问题讨论】:

    标签: algorithm analysis amortized-analysis


    【解决方案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)。

    【讨论】:

    • 这是不正确的;摊销成本为 O(k)。很抱歉(非常)迟到的评论和反对票;我在另一个问题的链接中看到了这个答案。 (正如您自己注意到的,单个增量的摊销成本是恒定的。)
    • 他问“数组以 n 开头”时会发生什么。假设对于一些大的 d 和 k=1,n=2^d-1,即只有一个增量操作。该操作需要时间 Omega(d),而不是 O(k)。
    • 是的,根据“摊销”的定义,“摊销”复杂度并不能预测进行单次计算的成本。您正在提供“最坏情况”复杂性的示例。
    • 我所说的对于任何 k
    猜你喜欢
    • 2019-08-10
    • 2013-11-08
    • 2016-03-16
    • 1970-01-01
    • 2012-12-09
    • 2015-05-20
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多