主定理用于确定具有递归即可以分解为子问题的函数的Big-O上限。
减法和征服递归的主定理:
令T(n)是在正n上定义的函数,如下所示:
对于某些常数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 <= 0Sol: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 = 1Sol: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)