Big O表示法 - 递归函数

时间:2017-09-14 15:00:20

标签: algorithm recursion

我需要找到这种递归算法的复杂性,所以,我有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;  
    }
}

这种递归算法的复杂性是什么,我没有这个算法的解决方案,你能帮助我吗?

2 个答案:

答案 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)