【发布时间】:2017-08-04 21:07:16
【问题描述】:
基于此代码:
int poow(int x,int y)
{
if(y==0)
return 1;
if(y%2!= 0)
return poow(x,y-1)*x;
return poow(x,y/2)*poow(x,y/2); //this line
}
我试图查看复杂性:我们假设我们有 n=2^k
我们有 T(0)=1
T(n)=2*T(n/2)+C
T(n)=2^i * T(n/2^i)+i*c
对于 i=k,我们有 T(n)=2^k * T(n/2^k) + k * c
T(n)=2^k * T(1) + k*c
T(n)=2^k * c2 + k * c
我被困在这里?如何继续计算复杂性以及更改此行时有什么区别:
return poow(x,y/2)*poow(x,y/2); //this line
与
int p=poow(x,y/2);
return p*p;
就复杂性而言!
【问题讨论】:
-
那么..关于您遇到问题的代码,您有什么问题?
-
你犯了一个错误。
T(n)=2*T(n/2)+C = T(n)=2*(2*T(n/4) + C)+C = 4*T(n/4) + 3C != 4*T(n/4) + 2C -
这个错误其实并不重要,但还是谢谢。
-
第一个是
O(n),第二个是O(lg n)。我认为这很简单,哪个更好:) -
x*pow(x,n-1)可能比pow(x,n-1)*x更快(但可能不是),但复杂性与速度无关,而与缩放。两者具有相同的复杂性。
标签: c algorithm time-complexity analysis