使用主定理求时间复杂度
很多算法最后都可以写出 T ( n ) = a T ( n b ) + f ( n ) ) ( a ≥ 1 , b ≥ 1 ) T(n)=aT(\frac{n}{b}) + f(n)) (a\ge1,b\ge1) T(n)=aT(bn)+f(n))(a≥1,b≥1) 的递推式。针对这种形式的递推式,通常情况下我们直接可以用主定理求解复杂度,而不需要笔和纸的帮助。
主定理
直接可用主定理
-
例1: T ( n ) = 2 T ( n 4 ) + 1 T(n)=2T(\frac{n}{4})+1 T(n)=2T(4n)+1
-
解:由题目得: a = 2 , b = 4 , f ( n ) = 1 a=2,b=4,f(n)=1 a=2,b=4,f(n)=1 ,此时 l o g b a = l o g 4 2 = 0.5 log_{b}a=log_{4}2=0.5 logba=log42=0.5 ,
则 只需要比较 n 0.5 n^{0.5} n0.5和 f ( n ) = 1 f(n)=1 f(n)=1 的大小。
可以利用主定理的第一种情况:
存在常数 ε = 0.5 \varepsilon =0.5 ε=0.5 使得有 f ( n ) = O ( n 0.5 − 0.5 ) f(n)=O(n^{0.5-0.5}) f(n)=O(n0.5−0.5),则 T ( n ) = Θ ( n 0.5 ) T(n)=\Theta(n^{0.5}) T(n)=Θ(n0.5)
-
-
例2: T ( n ) = 2 T ( n 4 ) + n T(n)=2T(\frac{n}{4})+\sqrt{n} T(n)=2T(4n)+n
-
解:由题目得: a = 2 , b = 4 , f ( n ) = n a=2,b=4,f(n)=\sqrt{n} a=2,b=4,f(n)=n ,此时 l o g b a = l o g 4 2 = 0.5 log_{b}a=log_{4}2=0.5 logba=log42=0.5 ,
则 只需要比较 n 0.5 n^{0.5} n0.5和 f ( n ) = n f(n)=\sqrt{n} f(n)=n 的大小。
可以利用主定理的第二种情况:
有 f ( n ) = O ( n 0.5 ) f(n)=O(n^{0.5}) f(n)=O(n0.5),则 T ( n ) = Θ ( n 0.5 l g n ) T(n)=\Theta(n^{0.5}lgn) T(n)=Θ(n0.5lgn)
-
-
例3: T ( n ) = 2 T ( n 4 ) + n 2 T(n)=2T(\frac{n}{4})+n^{2} T(n)=2T(4n)+n2
-
解:由题目得: a = 2 , b = 4 , f ( n ) = n 2 a=2,b=4,f(n)=n^{2} a=2,b=4,f(n)=n2 ,此时 l o g b a = l o g 4 2 = 0.5 log_{b}a=log_{4}2=0.5 logba=log42=0.5 ,
则 只需要比较 n 0.5 n^{0.5} n0.5和 f ( n ) = n 2 f(n)=n^{2} f(n)=n2 的大小。
可以利用主定理的第三种情况:
存在常数 ε = 1.5 \varepsilon =1.5 ε=1.5 使得有 f ( n ) = Ω ( n 0.5 + 1.5 ) f(n)=\Omega(n^{0.5+1.5}) f(n)=Ω(n0.5+1.5),且对常数 1 8 < c < 1 \frac{1}{8}<c<1 81<c<1与所有足够大的 n n n,有 2 ∗ ( n 4 ) 2 ≤ c ∗ n 2 2*(\frac{n}{4})^{2}\le c*n^{2} 2∗(4n)2≤c∗n2
则 T ( n ) = Θ ( n 2 ) T(n)=\Theta(n^{2}) T(n)=Θ(n2)
-
转化之后可以利用主定理
有一些递推式看着不满足主定理的形式,但是转换之后可以使用主定理。
-
例1: T ( n ) = 2 T ( n − 1 ) + n T(n)=2T(n-1)+n T(n)=2T(n−1)+n
-
解:令 n = l g ( k ) n=lg(k) n=lg(k),
则原式可化为: T ( l g ( k ) ) = 2 T ( l g ( k 2 ) ) + n T(lg(k))=2T(lg(\frac{k}{2}))+n T(lg(k))=2T(lg(2k))+n
此时看着像主定理了,是吧。因为 T T T 是一种关系,所以我们可以把关系 T T T 用 L ( k ) = T ( l g ( k ) ) L(k)=T(lg(k)) L(k)=T(lg(k))替换掉,则:
L ( k ) = 2 L ( k 2 ) + l g ( k ) L(k)=2L(\frac{k}{2})+lg(k) L(k)=2L(2k)+lg(k)
此时和上面一样可以应用主定理的第一种情况,得到 L ( k ) = Θ ( k ) L(k)=\Theta(k) L(k)=Θ(k)
再次代换回去得: L ( k ) = T ( l g ( k ) ) = T ( n ) = Θ ( k ) = Θ ( n 2 ) L(k)=T(lg(k))=T(n)=\Theta(k)=\Theta(n^{2}) L(k)=T(lg(k))=T(n)=Θ(k)=Θ(n2)
-
-
例2: T ( n ) = n T ( n ) + n T(n)=\sqrt{n}T(\sqrt{n})+n T(n)=nT(n)+n
-
解:令 n = 2 k n=2^k n=2k,
则原式可化为: T ( 2 k ) = 2 k 2 T ( 2 k 2 ) ) + 2 k T(2^k)=2^{\frac{k}{2}}T(2^{\frac{k}{2}}))+2^k T(2k)=22kT(22k))+2k
两边同时除以 2 k 2^k 2k得: T ( 2 k ) 2 k = T ( 2 k 2 ) ) 2 k 2 + 1 \frac{T(2^k)}{2^k}=\frac{T(2^{\frac{k}{2}}))}{2^{\frac{k}{2}}}+1 2kT(2k)=22kT(22k))+1
此时看着像主定理了,是吧。因为 T T T 是一种关系,所以我们可以把关系 T T T 用 L ( k ) = T ( 2 k ) 2 k L(k)=\frac{T(2^k)}{2^k} L(k)=2kT(2k)替换掉,则:
L ( k ) = L ( k 2 ) + 1 L(k)=L(\frac{k}{2})+1 L(k)=L(2k)+1
此时和上面一样可以应用主定理的第二种情况,得到 L ( k ) = Θ ( l g ( k ) ) L(k)=\Theta(lg(k)) L(k)=Θ(lg(k))
再次代换回去得: L ( k ) = T ( 2 k ) 2 k = T ( n ) n = Θ ( l g ( k ) ) = Θ ( l g ( l g ( n ) ) ) L(k)=\frac{T(2^k)}{2^k}=\frac{T(n)}{n}=\Theta(lg(k))=\Theta(lg(lg(n))) L(k)=2kT(2k)=nT(n)=Θ(lg(k))=Θ(lg(lg(n)))
整理可得: T ( n ) = n Θ ( l g ( l g ( n ) ) ) = Θ ( n l g ( l g ( n ) ) ) T(n)=n\Theta(lg(lg(n)))=\Theta(nlg(lg(n))) T(n)=nΘ(lg(lg(n)))=Θ(nlg(lg(n)))
-