分而治之的时间复杂度

时间:2019-02-08 21:26:51

标签: algorithm time-complexity

我正在尝试两次计算以下函数的时间复杂度。 我尝试了两种不同的方法

1)由于几乎每次都会有两个递归调用。    我们可以将递归关系写为T(n)=2T(n/2)+c。    这给了我们O(logn)

2)但是我们也可以说递归调用的总数为    等于n,这使我们的时间复杂度为O(n)。    因为每次次数都变成一半,但是有两个递归调用。

哪个是正确的?

我从这里看到了第二种方法https://www.geeksforgeeks.org/write-a-c-program-to-calculate-powxn/

请参见上面链接中方法1的时间复杂度

注意->我知道我们可以存储power(x,n / 2)的结果。

/* Function to calculate x raised to the power n */

int power(int x, unsigned int n) 
{ 
    if (n == 0) 
        return 1; 
    else if (n%2 == 0) 
        return power(x, n/2)*power(x, n/2); 
    else
        return x*power(x, n/2)*power(x, n/2); 
} 

2 个答案:

答案 0 :(得分:4)

  

1)由于几乎每次都会有两个递归调用。      我们可以将递归关系写为T(n)=2T(n/2)+c。      这给了我们O(logn)

您在某种程度上犯了一个错误。 T n )== 2‍ T n / 2)+ c 可以 not 给出 O (log n );而是给出 O n )。 (这属于https://en.wikipedia.org/wiki/Master_theorem_(analysis_of_algorithms)的情况1。)

  

2)但是我们也可以说递归调用的总数为      等于n,这使我们的时间复杂度为O(n)。      因为每次次数都变成一半,但是有两个递归调用。

这是正确的。

答案 1 :(得分:0)

所以T(n)= 2T(n / 2)+ c 实际上,这本身就是O(n)。

这是对此的正式证明。 T(n)= 2T(n / 2 ^ 1)+ c(2 ^ 0)

进一步突破

T(n)= 2(2T(n / 2 ^ 2)+ c)+ c(2 ^ 0)

简化:

T(n)= 2 ^ 2 T(n / 2 ^ 2)+ c(2 ^ 0)+ c(2 ^ 1)

如果进一步尝试,可以尝试得到这样的表达式

T(n)= 2 ^ 3 T(n / 2 ^ 3)+ c(2 ^ 0)+ c(2 ^ 1)+ c(2 ^ 2)

现在关键是您能将它破解多远,应该到2 ^ something等于n以便n / n = 1且T(1)恒定的时候。

可以轻松地将某些东西计算为log(n)base(2)。

因此,通过检查,您可以预测您的最终表达将像这样

T(n)= 2 ^ log(n)T(n / 2 ^ log(n))+ c(2 ^ 0)+ c(2 ^ 1)+ ........ + 2 ^(log(n)-1)

=n T(1)+c(2^0+2^1+2^2+.......2^(log(n)-1))

=n T(1)+c(n-1)

因此

T(n)=(T(1)+ c)n-c,它是o(n)。