如何计算算法时间复杂度?主定理(主方法)!

主方法只适用于特定的递归算法,当一个递归算法中一个问题可以拆解称若干个相同的子问题,每个子问题规模大小相同时可以运用主定理求得其时间复杂度。
此类递归算法有递归式 T ( n ) = a T ( n b ) + f ( n ) T(n)=aT(\frac{n}{b})+f(n) T(n)=aT(bn)+f(n),一个问题可以拆解称 a ( a ≥ 1 ) a(a≥1) a(a1)个相同的子问题,每个子问题规模大小为 1 b ( b ≥ 1 ) \frac{1}{b}(b≥1) b1(b1), f ( n ) f(n) f(n)为与规模相关的非递归部分的语句执行次数 ( f ( n ) 需 满 足 ∃ n 0 , 当 n ≥ n 0 时 , f ( n ) > 0 ) (f(n)需满足∃n_0,当n≥n_0时,f(n)>0) (f(n)n0,nn0f(n)0)
主方法的运用有三种情形:我们知道递归的解空间是一个树,递归树叶节点的数量为 n log ⁡ b a n^{\log_b a} nlogba,将 f ( n ) f(n) f(n) n log ⁡ b a n^{\log_b a} nlogba进行比较(在渐进情况下),得到三种比较结果

f ( n ) < n log ⁡ b a f(n)<n^{\log_b a} f(n)<nlogba

严谨表达为 f ( n ) = O ( n log ⁡ b a − ε ) ( ε > 0 ) f(n)=O(n^{\log_b a-\varepsilon})(\varepsilon>0) f(n)=O(nlogbaε)(ε0)
这种情况下 T ( n ) = Θ ( n log ⁡ b a ) T(n)=\Theta(n^{\log_b a}) T(n)=Θ(nlogba) Θ \Theta Θ是算法分析中渐进分析的标记符号,按大部分本科教材,这里的时间复杂度可以记为 T ( n ) = O ( n log ⁡ b a ) T(n)=O(n^{\log_b a}) T(n)=O(nlogba)

f ( n ) = n log ⁡ b a f(n)=n^{\log_b a} f(n)=nlogba

严谨表达为 f ( n ) = Θ ( n log ⁡ b a ( log ⁡ 2 n ) k ) ( k ≥ 0 ) f(n)=\Theta(n^{\log_b a}(\log_2n)^k)(k≥0) f(n)=Θ(nlogba(log2n)k)(k0)
这种情况下 T ( n ) = Θ ( n log ⁡ b a ( log ⁡ 2 n ) k + 1 ) ) T(n)=\Theta(n^{\log_b a}(\log_2n)^{k+1})) T(n)=Θ(nlogba(log2n)k+1)) Θ \Theta Θ是算法分析中渐进分析的标记符号,按大部分本科教材,这里的时间复杂度可以记为 T ( n ) = O ( n log ⁡ b a ( log ⁡ 2 n ) k + 1 ) ) T(n)=O(n^{\log_b a}(\log_2n)^{k+1})) T(n)=O(nlogba(log2n)k+1))

f ( n ) > n log ⁡ b a f(n)>n^{\log_b a} f(n)nlogba

严谨表达为 f ( n ) = Ω ( n log ⁡ b a + ε ) ( ε > 0 ) 且 a f ( n b ) ≤ ( 1 − ε ′ ) f ( n ) ( ε ′ > 0 ) f(n)=\Omega(n^{\log_b a+\varepsilon})(\varepsilon>0)且af(\frac{n}{b})≤(1-\varepsilon^{'})f(n)(\varepsilon^{'}>0) f(n)=Ω(nlogba+ε)(ε0)af(bn)(1ε)f(n)(ε0)
这种情况下 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n)) Θ \Theta Θ是算法分析中渐进分析的标记符号,按大部分本科教材,这里的时间复杂度可以记为 T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))

应用

  • 考察归并排序算法,可以写出其递归式为 T ( n ) = 2 T ( n 2 ) + n T(n)=2T(\frac{n}{2})+n T(n)=2T(2n)+n ,显然 log ⁡ b a = 1 , n = n ( log ⁡ 2 n ) k ( k = 0 ) \log_b a=1,n=n(\log_2n)^k(k=0) logba=1,n=nlog2n)k(k=0)
    故归并排序算法的时间复杂度为 O ( n log ⁡ 2 2 ( log ⁡ 2 n ) 0 + 1 ) = O ( n log ⁡ 2 n ) O(n^{\log_2 2}(\log_2n)^{0+1})=O(n\log_2 n) O(nlog22(log2n)0+1)=O(nlog2n)

  • T ( n ) = 4 T ( n 2 ) + n T(n)=4T(\frac{n}{2})+n T(n)=4T(2n)+n ,显然 log ⁡ b a = 2 , n ≤ n 2 \log_b a=2,n≤n^2 logba=2,nn2
    故该递归式对应递归算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

  • T ( n ) = 4 T ( n 2 ) + n 2 T(n)=4T(\frac{n}{2})+n^2 T(n)=4T(2n)+n2,按照相同思路,不难得到该递归式对应递归算法的时间复杂度为 O ( n 2 log ⁡ 2 n ) O(n^2\log_2 n) O(n2log2n)

  • T ( n ) = 4 T ( n 2 ) + n 3 T(n)=4T(\frac{n}{2})+n^3 T(n)=4T(2n)+n3,符合第三种情况,可以得到其递归算法的时间复杂度为 O ( n 3 ) O(n^3) O(n3)

猜你喜欢

转载自blog.csdn.net/RealCoder/article/details/107303381