最后更新于2年前
在介绍主定理之前,需要了解一下关于表示时间复杂度的几种形式。
O(big−O)O(big-O)O(big−O) 表示最坏时间复杂度,为上界。
Ω(big−Omega)\Omega(big-Omega)Ω(big−Omega) 表示最优时间复杂度,为下界。
Θ(big−Theta)\Theta(big-Theta)Θ(big−Theta) 表示确界,当上界和下届相同时,可以用这个来表示时间复杂度。
主定理主要解决递归式的时间复杂度计算。但并不能解决所有的递归式。主要适用如下递归式:
nnn 是问题规模。
aaa 为递归的子问题。
nb{n \over b}bn 为每个子问题的规模。
f(n)f(n)f(n) 为递归以外的计算量。
三种 case
主定理的结果主要跟 f(n)f(n)f(n) 有关。
当 f(n)=O(n(logba)−ϵ)f(n) = O(n^{(\log_ba) - \epsilon})f(n)=O(n(logba)−ϵ) 其中 ϵ>0\epsilon > 0ϵ>0 (相当于 logba>f(n)\log_ba > f(n)logba>f(n)),则有 T(n)=Θ(nlogba)T(n) = \Theta(n^{log_ba})T(n)=Θ(nlogba)。
当 f(n)=Θ(nlogba)f(n) = \Theta(n^{\log_ba})f(n)=Θ(nlogba),则有T(n)=Θ(nlogbalogn)T(n) = \Theta(n^{\log_ba}\log n)T(n)=Θ(nlogbalogn)。
当 f(n)=Ω(n(logba)+ϵ)f(n) = \Omega(n^{(\log_ba) + \epsilon})f(n)=Ω(n(logba)+ϵ) 其中 ϵ>0\epsilon > 0ϵ>0 (相当于logba<f(n)\log_ba < f(n)logba<f(n)),则有 T(n)=Θ(f(n))T(n) = \Theta(f(n))T(n)=Θ(f(n))
简化版本
计算递归时间复杂度的话,一般两种方法,画递归树手算和用主定理,具体情况具体分析。
如果 T(n)=aT(nb)+O(nd)T(n) = aT({n \over b}) + O(n^d)T(n)=aT(bn)+O(nd)(其中 a>0,b>1,d≥0a > 0, b > 1, d \ge 0a>0,b>1,d≥0),则有