【问题标题】:Big O notations - Recursive functions大 O 表示法 - 递归函数
【发布时间】:2017-09-14 23:37:03
【问题描述】:

我需要找出这种递归算法的复杂性,所以,我有 3 种递归算法,只是想知道它们的大 O 表示法。我想我有其中两种算法的解决方案,只是想咨询社区。​​p>

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;  
    }
}

这个递归算法的复杂度是多少,我没有这个算法的解决方案,你能帮帮我吗?

【问题讨论】:

  • “他们的大 O 表示法”是指他们的时间复杂度还是他们的结果的增长顺序?
  • 我认为你需要时间复杂度。另外,编辑你的函数 f3,它不需要任何参数
  • Master-Theorem 是解决更复杂的重复问题的常用方法,例如您问题中的最后一个问题。

标签: algorithm recursion


【解决方案1】:

你的前两个答案是正确的。 让我们对你的第三个问题进行分析, 对于每一次,n 除以 2,我们需要将 x 添加 n 次, 所以复杂性将是 1*n+1*n/2+1*n/4+.....+1=n(1+1/2+1/4+...)=O(n)

【讨论】:

    【解决方案2】:

    @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)
    

    【讨论】: