考试答案确认 - 摊还时间

时间:2012-09-30 08:44:10

标签: big-o time-complexity

以下方法op属于具有两个私有整数值实例变量n的类 和计数器,它们都在构造函数中初始化为零值,并且随后只是 通过方法op。

修改
public void op()
{
    if(counter<100)
    {
        op1(); //method with O(1) time complexity
        counter++;
    }else {
        op2(); //method with O(n^2) time complexity
        counter = 0;
    }
    n++;
}

假设方法op1具有时间复杂度O(1),并且方法op2具有时间复杂度O(n ^ 2),以下哪个最能代表方法op的摊销时间复杂度?

A)O(n)

B)O(n log n)

C)O(1)

D)O(n ^ 2)

E)O(n3)

考试的答案是D.我认为从我对摊销时间的理解应该是C,你算一下大多数当时会发生什么。在这种情况下,最坏的情况是O(n ^ 2),但是大多数时候算法将在O(1)中运行。为什么是O(n ^ 2)?

1 个答案:

答案 0 :(得分:8)

在讨论分期付款的运行时时,您可以计算大多数当时会发生什么。 首先,您如何定义大部分时间? 操作的分摊运行时间可以视为操作的平均运行时间。

现在问题:

为简单起见,我假设你写了if (counter < 99)而不是if (counter < 100)。这样,操作在100个循环后重复,而不是在101个循环后重复。

在撰写O(...)时,在下文中,我实际上是指Θ(...),因为否则您的问题的答案将是微不足道的,因为O(1)的所有内容也是{{1} }}

致电O(n^2) 100次后,总运行时间为op() 致电99 + 100^2 200次后,总运行时间为op() 现在让我们忘记那些2 * 99 + 100^2 + 200^299,因为它们由2 * 99值支配。
因此,在调用n^2 op()次后,总运行时间将类似于n(为简单起见,我们假设100^2 + 200^2 + ... + n^2可被n整除)。

现在我将证明这是100

O(n^3)

最后,Let k = n/100 100^2 + 200^2 + ... + n^2 = 100^2 * (1^2 + 2^2 + ... + k^2) =(*) O(100^2 * k * k^2) = O(k^3) = O(n^3) (*): sum from 1 to k of i^2 is k (k+1) (2k+1) / 6 = O(k^3) 的平均运行时间为op()。因此,O(n^3 / n) = O(n^2)的摊销运行时为op()

相关问题