主定理速成

https://en.wikipedia.org/wiki/Master_theorem_(analysis_of_algorithms)

对于时间复杂度形如

T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n)

的递归过程,有

  1. f(n)=O(nc),c<logbaf(n)=O(n^c),c<\log_ba,则 T(n)=Θ(nlogba)T(n)=\Theta(n^{\log_b a}),此时递归树的调用复杂度更大;
  2. f(n)=Θ(nlogbalogkn),k0f(n)=\Theta(n^{\log_ba}\log^kn),k\ge 0,则 T(n)=Θ(nlogbalogk+1n)T(n)=\Theta(n^{\log_ba}\log^{k+1}n);更一般地,对于所有 kk
    • k>1k>-1,则 T(n)=Θ(nlogbalogk+1n)T(n)=\Theta(n^{\log_ba}\log^{k+1}n)
    • k=1k=-1,则 T(n)=Θ(nlogbaloglogn)T(n)=\Theta(n^{\log_ba}\log\log n)
    • k<1k<-1,则 T(n)=Θ(nlogba)T(n)=\Theta(n^{\log_ba})
  3. f(n)=Ω(nc),c>logbaf(n)=\Omega(n^c),c>\log_ba,且存在 k<1k<1 使得对于足够大的 nnaf(n/b)kf(n)af(n/b)\le kf(n),则 T(n)=Θ(f(n))T(n)=\Theta(f(n)),此时 ff 的调用复杂度更大。

简单的记忆方式:

T(n)=aT(n/b)+f(n)=aT(n/b)+O(nclogkn)T(n)=aT(n/b)+f(n)=aT(n/b)+O(n^c\log^kn)

T(n)={O(nlogbalogk+1n)c=logbaO(max{nlogba,f(n)})otherwiseT(n)= \begin{cases} O(n^{\log_ba}\log^{k+1}n)&c=\log_ba\\ O(\max\{n^{\log_ba},f(n)\})&\textrm{otherwise} \end{cases}

注意,上式牺牲了一定严谨性。