主定理用于根据渐近符号确定算法(分治算法)的运行时间。
考虑使用递归解决的问题。
function f(input x size n)
if(n < k)
solve x directly and return
else
divide x into a subproblems of size n/b
call f recursively to solve each subproblem
Combine the results of all sub-problems
上述算法将问题划分为大小为 n/b的子问题,并递归求解它们以计算问题,为问题所做的额外工作由 f(n) 给出,即创建子问题并组合它们的时间导致上述过程。
因此,根据主定理,上述算法的运行时间可以表示为:
T(n) = aT(n/b) + f(n)
其中 n = 问题的大小
a = 递归中子问题的数量且 a >= 1
n/b = 每个子问题的大小
f(n) = 在递归调用之外完成的工作成本,例如划分子问题和组合它们以获得解决方案的成本。
并非所有递推关系都可以使用主定理来解决,即如果
- T(n) 不是单调的,例如:T(n) = sin n
- f(n) 不是多项式,例如:T(n) = 2T(n/2) + 2 n
该定理是主定理的高级版本,如果递归具有以下形式,则可用于确定分治算法的运行时间:-
其中 n = 问题的大小
a = 递归中子问题的数量且 a >= 1
n/b = 每个子问题的大小
b > 1, k >= 0 并且 p 是实数。
然后,
- 如果 a > b k ,则 T(n) = θ(n log b a )
- 如果 a = b k ,则
(a) 如果 p > -1,则 T(n) = θ(n log b a log p+1 n)
(b) 如果 p = -1,则 T(n) = θ(n log b a loglogn)
(c) 如果 p < -1,则 T(n) = θ(n log b a ) - 如果 a < b k ,则
(a) 如果 p >= 0,则 T(n) = θ(n k log p n)
(b) 如果 p < 0,则 T(n) = θ(n k )
时间复杂度分析——
- 示例 1:二分搜索 – T(n) = T(n/2) + O(1)
a = 1, b = 2, k = 0 和 p = 0
b k = 1。因此,a = b k且 p > -1 [情况 2.(a)]
T(n) = θ(n log b a log p+1 n)
T(n) = θ(logn) - 示例 2:归并排序 – T(n) = 2T(n/2) + O(n)
a = 2, b = 2, k = 1, p = 0
b k = 2。因此,a = b k且 p > -1 [情况 2.(a)]
T(n) = θ(n log b a log p+1 n)
T(n) = θ(nlogn) - 示例 3: T(n) = 3T(n/2) + n 2
a = 3, b = 2, k = 2, p = 0
b k = 4。因此,a < b k且 p = 0 [案例 3.(a)]
T(n) = θ(n k log p n)
T(n) = θ(n 2 ) - 示例 4: T(n) = 3T(n/2) + log 2 n
a = 3, b = 2, k = 0, p = 2
b k = 1。所以,a > b k [案例 1]
T(n) = θ(n log b a )
T(n) = θ(n log 2 3 ) - 示例 5: T(n) = 2T(n/2) + nlog 2 n
a = 2, b = 2, k = 1, p = 2
b k = 2。所以,a = b k [案例 2.(a)]
T(n) = θ(n log b a log p+1 n )
T(n) = θ(n log 2 2 log 3 n)
T(n) = θ(nlog 3 n) - 示例 6: T(n) = 2 n T(n/2) + n n
使用上述方法无法解决此递归问题,因为函数不是 T(n) = aT(n/b) + θ(n k log p n) 形式
GATE 练习题——
- GATE-CS-2017(套装2)|第 56 题
- 门 IT 2008 |第 42 题
- GATE CS 2009 |第 35 题