2015-10-05 145 views
0

我有两个C程序递归X^N算法的时间复杂度

其中输入的N应是任意整数2^N:N> = 1

一个是 -

int power(int x,int n) 
{ 
if(n==2) 
return x*x; 
else 
return power(x,n/2)*power(x,n/2); 
} 
int main() 
{ 
    int x=6; 
    int n=8; 
    printf("%d",power(x,n)); 
    getch(); 
} 

其他一个是 -

int power(int x,int n) 
{ 
if(n==2) 
return x*x; 
else 
{ 
int result=power(x,n/2); 
return result*result; 
} 
} 
int main() 
{ 
    int x=6; 
    int n=8; 
    printf("%d",power(x,n)); 
    getch(); 
} 

这是第一次复杂的功能将是─

因此,通过推导,我们将得到 O(log n)

在过去的一个210

T(n)=2T(n/2)+c将通过推导,我们将得到O(log n)

是正确的是─

T(n)=T(n/2)+c因此?

+0

为第一个'T(N)= O(n)的',和用于第二'T(N)= 0(log n)的' – svs

+0

你怎么能解释一下? –

+0

首先运行参数为'2,3'的函数,看看会发生什么,然后我会解释。您的基本情况应该是'n == 0' mate – svs

回答

1

对于第一种关系,你实际上有

T(n) = 2 T(n/2)+c = 2^2*T(n/2^2) + 2c+c = ... 
= 2^(k-1)*T(n/2^(k-1)) + (k-1)*c+(k-2)*c+...+c = 
= 2^(k-1)*T(2) + (k-1)*k*c/2 = n/2 + c*(log n-1)(log n)/2 = O(n) 

,因为你有n=2^kn/2主导c*(log n)^2(如n趋于无穷n/2变得比c*(log n)^2大得多)。

对于第二个你是对:

T(n) = 2*T(n/2)+c = T(n/2^2) + 2c = ... = T(n/2^(k-1)) + (k-1)c = T(2)+(k-1)*c= 
= 1 + c*(logn-1) = O(log n) 
+1

明白了。第一个将是'O(n)'。 但我认为你的推导过程中有一个错误,即T(n)= 2 T(n/2)+ c = 2^2 * T(n/2^2)+ 2c + c = .... = 2 ^(k-1)* T(n/2 ^(k-1))+(k-1)* c + .... + c = n + c *(n/2 -1)' –

+0

@AnuragChakraborty是的,你是对的。修复。但复杂性保持不变。 – svs