📜  减法和征服递归的主定理

📅  最后修改于: 2021-04-25 01:03:22             🧑  作者: Mango

主定理用于确定具有递归即可以分解为子问题的函数的Big-O上限。
减法和征服递归的主定理
令T(n)是在正n上定义的函数,如下所示:
2017-07-12 14-14-44的屏幕截图
对于某些常数c,a> 0,b> 0,k> = 0和函数f(n)。如果f(n)为O(n k ),则

1.如果a <1,则T(n)= O(n k )
2.如果a = 1,则T(n)= O(n k + 1 )
3.如果a> 1,则T(n)= O(n k a n / b )

上面定理的证明(用替代方法)

从上面的函数,我们有:
T(n)= aT(nb)+ f(n)
T(nb)= aT(n-2b)+ f(nb)
T(n-2b)= aT(n-3b)+ f(n-2b)

现在,
T(nb)= a 2 T(n-3b)+ af(n-2b)+ f(nb)
T(n)= a 3 T(n-3b)+ 2 f(n-2b)+ af(nb)+ f(n)
T(n)= Σi = 0至n a i f(n-ib)+常数,其中f(n-ib)为O(n-ib)
T(N)= O(NķΣi = 0到N / B A I)

在哪里,
如果a <1,则Σi = 0至n / b a i = O(1),T(n)= O(n k )

如果a = 1则Σi = 0至n / b a i = O(n),T(n)= O(n k + 1 )

如果a> 1,则Σi = 0至n / b a i = O(a n / b ),T(n)= O(n k a n / b )

考虑以下程序的第n个斐波那契数

C++
#include
int fib(int n)
{
   if (n <= 1)
      return n;
   return fib(n-1) + fib(n-2);
}
   
int main ()
{
  int n = 9;
  printf("%d", fib(n));
  getchar();
  return 0;
}


Python3
# Python3 code for the above approach
def fib(n): 
    if (n <= 1): 
        return n 
    return fib(n - 1) + fib(n - 2) 
  
# Driver code
n = 9
print(fib(n))
  
# This code is contributed
# by sahishelangia


Java
//Java code for above the approach. 
class clg 
{
 static int fib(int n)
{
if (n <= 1)
    return n;
return fib(n-1) + fib(n-2);
}
// Driver Code
public static void main (String[] args)
{
int n = 9;
System.out.println( fib(n));
}
}
// This code is contributed by Mukul Singh.


C#
// C# code for above the approach.
using System;
      
class GFG 
{
    static int fib(int n)
    {
        if (n <= 1)
            return n;
        return fib(n - 1) + fib(n - 2);
    }
      
    // Driver Code
    public static void Main(String[] args)
    {
        int n = 9;
        Console.WriteLine(fib(n));
    }
}
  
// This code has been contributed 
// by Rajput-Ji


PHP


输出

34

时间复杂度分析:
递归函数可以定义为T(n)= T(n-1)+ T(n-2)

  • 对于最坏的情况,让T(n-1)&ap; T(n-2)
    T(n)= 2T(n-1)+ c
    其中,f(n)= O(1)
    ∴k = 0,a = 2,b = 1;

    T(n)= O(n 0 2 n / 1 )
    = O(2 n )

  • 对于最佳情况,让T(n-2)&ap; T(n-1)
    T(n)= 2T(n-2)+ c
    其中,f(n)= O(1)
    ∴k = 0,a = 2,b = 2;

T(n)= O(n 0 2 n / 2 )
= O(2 n / 2 )

更多示例

  • 示例1
    T(n)= 3T(n-1),n> 0
    = c,n <= 0

    Sol:a = 3,b = 1,f(n)= 0,所以k = 0;

    由于a> 0,因此T(n)= O(n k a n / b )
    T(n)= O(n 0 3 n / 1 )
    T(n)= 3 n

  • 示例2
    如果n> = 2,则T(n)= T(n-1)+ n(n-1)
    = 1,如果n = 1

    Sol:a = 1,b = 1,f(n)= n(n-1)所以k = 2;

    由于a = 1,因此T(n)= O(n k + 1 )
    T(n)= O(n 2 + 1 )
    T(n)= O(n 3 )

  • 示例3
    T(n)= 2T(n-1)– 1,如果n> 0
    = 1,如果n <= 0

    索尔:使用上述方法无法解决此重复问题
    因为函数的形式不是T(n)= aT(nb)+ f(n)