我正在尝试两次计算以下函数的时间复杂度。 我尝试了两种不同的方法
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);
}
答案 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)。