1. 主定理
1.1 主定理介绍
1.2 不能使用主定理的情况
(1)T(n)不是单调函数,(e.g. T(n) = sinx)
(2)f(n)不是多项式函数 (e.g. T(n) = T(n/2) + 2n)
(3)b不能表示为一个常量(e.g. T(n) = 2T(√n))
1.3 举例说明
(1) T(n) = T(n/2) + 1/2 * n2 + n
解:
此时 a = 1, b = 2, f(n) = 1/2*n2 + n
故 nlogba = n0 = 1
f(n) = Ω(nlogba+2),ε=2,且当 C = 1/4时,满足第三种情况的条件
故第三种情况成立,T(n) = θ(n2)
(2) T(n) = 2T(n/4) + √n + 42
解:
此时 a = 2, b = 4, f(n) = √n + 42
故 nlogba = n1/2
所以 f(n) = Θ(nlogba)
故第二种情况成立,T(n) = Θ(nlogba*logn) = Θ(√n*logn)
(3) T(n) = 3T(n/2) + 3/4*n + 1
解:
此时 a = 3, b = 2, f(n) = 3/4*n + 1
故 nlogba = n
所以 f(n) = O(nlogba-(logba-1)),ε = logba-1 = log23-1 > 0,
故第一种情况成立,T(n) = Θ(nlogba) = Θ(nlog23)
2. 递归树
递归树是一棵结点带权值的树。初始的递归树只有一个结点,它的权标记为T(n);然后按照递归树的迭代规则不断进行迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点(即叶结点都为T(1)T(1))。下面以递归方程
为例讲解递归树。
首先这道题肯定是没法用主定理,所以画递归树:
因为每次两个分支大小不相同,故这颗树实际上并不像画出来这样的平衡,故树高度最高为log2n,最低为log4n
我们假设极限树高为log2n,即最大高度,且为平衡树,此时可以得到时间复杂度的上界:
同理当极限树高为log4n时,得到时间复杂度的下界:
故可知时间复杂度为
3. 找规律
T(n) = 2T(n-1) + 1(T(1) = 1)
这道题是不是看起来很像高中学的等比数列递推式,是的!不过对于这类题还有一种更通用的公式很方便:
对于这道题来说,c=1,b=2,g(n)=1,代入方程得:
与前面做法得到得结果相同