我需要找到这种递归算法的复杂性,所以,我有3个递归算法,只是想知道它们的Big O符号。我想我有其中两种算法的解决方案,只想与社区核实。
int f1(int n)
{
if ( n<= 1)
return (1);
else
return (n *f1(n-1))
}
我认为这个解决方案是O(n)。
int f2 (int n)
{
if(n<=1)
return(1);
else
return(n*f2(n / 2))
}
我认为这个解决方案是O(Log 2(n))
int f3
{
int x, i;
if( n <= 1)
return 1;
else
{
x = f3 (n / 2);
for( i = 1 ; i <= n ; i++)
x++;
return x;
}
}
这种递归算法的复杂性是什么,我没有这个算法的解决方案,你能帮助我吗?
答案 0 :(得分:1)
你的前两个答案是正确的。 让我们分析你的第三个问题, 对于每次,n除以2,我们需要添加x n次, 所以复杂性将是 1 * N + 1 * N / 2 + 1 * N / 4 + ..... + 1 = N(1 + 1/2 + 1/4 + ...)= O(n)的
答案 1 :(得分:1)
@codecrazers answer已经涵盖了如何逐步计算复杂性。但总的来说,Master-Theorem使问题变得更加简单。
首先,让我们转换这段代码
int f3 (int n)
{
int x, i;
if( n <= 1)
return 1;
else
{
x = f3 (n / 2);
for( i = 1 ; i <= n ; i++)
x++;
return x;
}
}
再次发生:
int f(int n)
{
if( n <= 1)
1
else
f(n / 2) + θ(n)
}
所以
T(n) = T(n / 2) + θ(n)
T(n <= 1) = 1
案例3,因此产生
T(n) = θ(n)