算法分析与设计 基础知识 递归方程 递归方程 归并排序算法的递归方程 T(n)={Θ(1)n=12T(n2)+Θ(n)n>1 \begin{aligned} T(n) = \begin{cases} \Theta(1) & n=1 \\ 2T(\dfrac{n}{2})+\Theta(n) & n>1 \end{cases} \end{aligned} T(n)={Θ(1)2T(2n)+Θ(n)n=1n>1这个方程的含义是如果只有 1 个元素的数组需要做归并排序,那么在常数时间内就能得到有序数组。 如果是 nnn 个元素的数组需要做归并排序,那么需要将问题一分为二,每个子问题各需要 T(n2)T(\dfrac{n}{2})T(2n) 的时间。解决子问题以后,当前问题转化为合并有序数组问题,两个指针会不重复扫描每个元素一遍,复杂度为 Θ(n)\Theta(n)Θ(n)。 可以使用逐层展开法和变量替换法求解 T(n)T(n)T(n),但是比较麻烦,仅作了解即可。 Master 定理 T(n)=aT(nb)+f(n),a≥1,b>1,f(n)>0 T(n) = aT(\dfrac{n}{b})+f(n), a \ge 1, b > 1, f(n) > 0 T(n)=aT(bn)+f(n),a≥1,b>1,f(n)>0比较 nlogban ^ {\log_{b}{a}}nlogba 的阶和 f(n)f(n)f(n) 的大小: 若 nlogban ^ {\log_{b}{a}}nlogba 大,则 T(n)=Θ(nlogba)T(n) = \Theta(n ^ {\log_{b}{a}})T(n)=Θ(nlogba) 若 f(n)f(n)f(n) 大,则 T(n)=Θ(f(n))T(n) = \Theta(f(n))T(n)=Θ(f(n)) 若 nlogba=f(n)n ^ {\log_{b}{a}} = f(n)nlogba=f(n),则 T(n)=Θ(nlogbalogn)=Θ(f(n)logn)T(n) = \Theta(n ^ {\log_{b}{a}} \log_{}{n}) = \Theta(f(n) \log_{}{n})T(n)=Θ(nlogbalogn)=Θ(f(n)logn) 对于归并排序,a=2a=2a=2,b=2b=2b=2,则 nlogba=nn ^ {\log_{b}{a}} = nnlogba=n。而 f(n)=Θ(n)f(n) = \Theta(n)f(n)=Θ(n),它们的阶数相当。因此归并排序的时间复杂度 T(n)=Θ(nlogn)T(n) = \Theta(n\log_{}{n})T(n)=Θ(nlogn)。 Master 定理的证明 算法分析