这个功能的时间成本是多少? (算法分析)

时间:2013-06-20 13:08:04

标签: algorithm

此函数的算术运算(以上限计)的时间成本是多少?

int foo(int n)
{
    int i;
    if (n <= 3) return 1;
    else if (n > 333) 
    {
        i = n/2;
        return 3 * foo(i) + foo(i) + n * i; 
    }
    else return foo(n - 3) + 9; 
}

我试图分析它,这些是我的想法:

  1. T(n)是:

       1                           ; if n ≤ 3
       4T(n/2) + (n2)/2            ; if n > 333       
       T(n-3) + 9                  ; otherwise
    
  2. 所以对于第二个等式,我可以说它是O((n2)/2 logn)

  3. 这是对的吗?

1 个答案:

答案 0 :(得分:3)

不要被抛入函数的所有操作所迷惑,这些操作只是常量时间操作。加法,乘法,比较 - 这些都是恒定时间操作。分支递归是您需要关注的。

在不改变复杂性的情况下,我可以将函数重新排列为等效函数:

int foo(int n)
{
    if (n <= 3) return 1;
    else if (n <= 333) return foo(n - 3) + 9;
    else
    {
        int i = n/2;
        return 3 * foo(i) + foo(i) + n * i; 
    }
}

前两个案例必不可少说“当n小于某个固定常数时,还有一定数量的工作要做。”因此,我们最终O(1)阻止结果的唯一方法是最后else阻止。

在那里,唯一的非常数时间操作是对foo(n/2)的两次调用。所以我们有递归关系

T(n) = T(n/2) + T(n/2) = 2T(n/2)

产生

T(n) = 2T(n/2) = 4T(n/4) = 8T(n/8) = ... = O(n)

因此foo(n)的复杂性为O(n)


WolframAlpha同意我的意见:
http://www.wolframalpha.com/input/?i=T%28n%29+%3D+2*T%28n%2F2%29

您必须具有T(n) = O(n) + 2*T(n/2)形式的重复关系才能获得T(n) = O(n log n)。 WolframAlpha再次同意:
http://www.wolframalpha.com/input/?i=T%28n%29+%3D+n+%2B+2*T%28n%2F2%29