问题:若某算法的计算时间表示为递推关系式:T(N)=2T(N/2)+NlogN 且 T(1)=1
则该算法的时间复杂度为( )。
O(Nsqrt(N))
O(NlogN)
O(N(logN)^2)
O(N^2logN)
O(N^2)
解析:
应该是 O(N(logN)^2)
参考网址:主定理和《算法导论》
但是博主说其实你不会主定理也没事儿,只要能找几个特殊值带入,并根据符号O的意义排除选项即可。所以……其实可以投机取巧。(望天)
主定理在《算法导论》的第53页时间复杂度章节有讲到(是的,黑色的很厚的那本)
对于三种情况的每一种,我们将函数f(n)与函数
nlogba进行比较。 直觉上, 两个函数较大者决定了递归式的解。若函数
nlogba更大,如情况1,则解为
T(n)=Θ(nlogba)。若函数f(n)更大,如情况3,则解为
T(n)=Θ(f(n))。若两个函数大小相当, 如情况2,则乘上一个对数因子,解为
T(n)=Θ(nlogbalgn)=Θ(f(n)lgn)。
注意, 这三种情况并未覆盖f(n)的所有可能性。情况1和情况2之间有一定间隙,f(n)可能小于
nlogba但不是多项式意义上的小于。 类似地,情况2和情况3之间也有一定间隙 ,f(n)可能大于
nlogba.但不是多项式意义上的大于。如果函数f(n)落在这两个间隙中,或者情况3中要求的正则条件不成立,就不能使用主方法来求解递归式。
在第一种情况中,不是 f(n)小于
nlogba就够了,
而是要多项式意义上的小于
。 也就是说,f(n)必须渐近小于
nlogba,要相差一个因子
nϵ,其中ϵ是大于0的常数。 在第三种情况中,不是f(n)大于
nlogba就够了,而是要多项式意义上的大于,而且还要满足“正则”
条件
af(n/b)≤cf(n)。我们将会遇到的多项式界的函数中, 多数都满足此条件。
假设我们有递推关系式:
根据这个题,
T(N)=2T(N/2)+NlogN且T(1)=1,可知
a=2,b=2,f(n)=NlogN,所以将函数
f(n)=NlogN与函数
Nlog22logN=NlogN进行比较,他们复杂度相近,是情况2。从而根据公式:
f(n)=Θ(nlogbalogkn),则T(n)=Θ(nlogbalogk+1n)。
有:
Γ(n)=nlog22∗(log2n)=n(logn)2
类题试解:
1.二叉树的遍历:
T(n)=2T(2n)+Θ(1)
可知
a=2,b=2,f(n)=1,
nlog22=n比
f(n)=Θ(1)大,是情况1,则根据公式,解为
T(n)=Θ(nlog22)=Θ(n)
2.二分搜索(折半搜索)
T(n)=T(2n)+Θ(1)
可知a=1,b=2,f(n)=Θ(1),
nlog21=n0=1,故f(n)和O(1)复杂度相近,是情况2,
根据公式,
T(n)=lgn
3.最大子数组问题和归并排序的分治算法的运行时间:
T(n)=2T(2n)+Θ(n)
可知a=2,b=2,
f(n)=Θ(n)
nlog22=n和
f(n)=Θ(n)相近,是情况2,
根据公式,
T(n)=Θ(nlogbalgn)=Θ(f(n)lgn)。
可得
T(n)=Θ(nlog22lgn)=Θ(nlog2n)。
4.递归式
T(n)=3T(n/4)+nlgn
我们有
a=3,b=4,f(n)=nlgn,而
nlog43=O(n0.793)
由于
f(n)=Ω(nlog43+ϵ)=Ω(n0.793+ϵ),其中
ϵ≈1−0.793=0.2,
f(n)=nlgn>nlog43满足情况3。且对常数c=0.75和所有足够大的n有
3(n/4)lg(n/4)≤0.75nlgn=cf(n)
故解为
T(n)=Θ(nlgn)
5.矩阵乘法问题第一个分治算法
T(n)=8T(2n)+Θ(n2)
有
a=8,b=2,f(n)=n2,
nlog28=n3可以看出
f(n)=n2<n3,应该是情况1,其中
ϵ=1
故
T(n)=Θ(n3)
6.Strassen算法的运行时间
T(n)=7T(n/2)+Θ(n2)
有a=7,b=2,
nlog27≈n2.805>n2,故f(n)<n2.805,应用情况1公式:
故
T(n)=Θ(nlog27)
改写底为
lg7
log27=lg2lg7=0.30.84=2.807
算法导论中的lg以2为底
故
T(n)=Θ(nlg7)=Θ(n2.807)
不能使用主定理的情况:
T(n)=2T(n/2)+Θ(nlgn)
其中
a=2,b=2,f(n)=nlgn
而
log22=n 而
f(n)=nlgn渐进大于n,而不是多项式大于n
(多项式意义上的大于,顾名思义,就是两个函数的商大于一个多项式。
严格表述为如下形式:当我们说f(x)多项式意义上大于g(x)时,我们是指:存在实数e>0,使得f(x)>g(x)*n^e。)
因此, 递归式落入了情况2和情况3之间的间隙,不可以使用主定理。
不过可以利用公式:
f(n)=Θ(nlogbalogkn),则T(n)=Θ(nlogbalogk+1n)。
根据算法导论P73的上下界取整:
可知
O(Nlog22N)是T(n)的上界(
O(N3)也是上界,但是不是紧确界)