
主定理主定理是用来分析分治算法递归式的渐进时间复杂度在初赛中经常考到递归式形如T(n)aT(n/b)f(n)T(n)aT(n/b)f(n)T(n)aT(n/b)f(n)。有三种情形f(n)f(n)f(n)增速较慢若∃ϵ0\exist\epsilon0∃ϵ0使得f(n)O(nlogba−ϵ)f(n)O(n^{\log_ba-\epsilon})f(n)O(nlogba−ϵ)则T(n)Θ(nlogba)T(n)\Theta(n^{\log_ba})T(n)Θ(nlogba)f(n)f(n)f(n)和nlogban^{\log_ba}nlogba同阶则T(n)Θ(nlogbalogn)T(n)\Theta(n^{\log_ba}\log n)T(n)Θ(nlogbalogn)f(n)f(n)f(n)增速较快若∃ϵ0\exist\epsilon0∃ϵ0使得f(n)Ω(nlogbaϵ)f(n)\Omega(n^{\log_ba\epsilon})f(n)Ω(nlogbaϵ)且af(n/b)≤cf(n)af(n/b)\le cf(n)af(n/b)≤cf(n)则T(n)Θ(f(n))T(n)\Theta(f(n))T(n)Θ(f(n))。无底数log\loglog默认222为底。形式化语言还是太难记了。其实我们将函数f(n)f(n)f(n)与nlogban^{\log_ba}nlogba比较更大的将决定T(n)T(n)T(n)nlogbaf(n)n^{\log_ba}f(n)nlogbaf(n)T(n)Θ(nlogba)T(n)\Theta(n^{\log_ba})T(n)Θ(nlogba)nlogbaf(n)n^{\log_ba}f(n)nlogbaf(n)T(n)Θ(f(n))T(n)\Theta(f(n))T(n)Θ(f(n))nlogbaf(n)n^{\log_ba}f(n)nlogbaf(n)答案乘上对数因子T(n)Θ(nlogbalogn)Θ(f(n)logn)T(n)\Theta(n^{\log_ba}\log n)\Theta (f(n)\log n)T(n)Θ(nlogbalogn)Θ(f(n)logn)。1.T(n)T(n/2)Θ(1)T(n)T(n/2)\Theta(1)T(n)T(n/2)Θ(1)a1,b2a1,b2a1,b2则nlogban01f(n)n^{\log_ba}n^01f(n)nlogban01f(n)所以T(n)Θ(logn)T(n)\Theta(\log n)T(n)Θ(logn)。2.T(n)2T(n/2)Θ(n)T(n)2T(n/2)\Theta(n)T(n)2T(n/2)Θ(n)a2,b2a2,b2a2,b2则nlogban1nf(n)n^{\log_ba}n^1nf(n)nlogban1nf(n)所以T(n)Θ(nlogn)T(n)\Theta(n\log n)T(n)Θ(nlogn)。3.T(n)3T(n/4)Θ(n1.2)T(n)3T(n/4)\Theta(n^{1.2})T(n)3T(n/4)Θ(n1.2)取log430.79\log_430.79log430.79a3,b4a3,b4a3,b4则nlogban0.79n1.2n^{log_ba}n^{0.79}n^{1.2}nlogban0.79n1.2则T(n)Θ(f(n))Θ(n1.2)T(n)\Theta(f(n))\Theta(n^{1.2})T(n)Θ(f(n))Θ(n1.2)4.T(n)2T(n)Θ(logn)T(n)2T(\sqrt{n})\Theta(\log n)T(n)2T(n)Θ(logn)有根号比较麻烦我们要想办法把它代换回熟悉的主定理式子。考虑消去根号令mlognm\log nmlognT(2m)2T(2m/2)Θ(m)T(2^m)2T(2^{m/2})\Theta(m)T(2m)2T(2m/2)Θ(m)把幂取下来不能直接带logloglog进去所以新开个函数H(x)logxH(x)\log xH(x)logxH(m)2H(m/2)Θ(m)H(m)2H(m/2)\Theta(m)H(m)2H(m/2)Θ(m)带入上面主定理mlog22mm^{\log_{2}2}mmlog22m所以H(m)Θ(mlogm)H(m)\Theta(m\log m)H(m)Θ(mlogm)代回mlognm\log nmlognTHΘ(lognloglogn)TH\Theta(\log n\log \log n)THΘ(lognloglogn)