复杂度计算 master 公式详解

发布时间 2023-09-08 10:56:25作者: NBest

2023-08-22 11:42:47 顶置3

前言

推了半个小时的式子,我感觉我已经彻底的理解了,所以前来写一篇复杂度 \(master\) 公式计算的结论和证明。

\(master\) 公式

可以解决的问题——给出递归的复杂度公式:

\[\large\begin{cases} T(1)=1\\T(n)=aT(\frac{n}{b})+f(n)\\f(n)=n^d\end{cases} \]

求递归 \(T(n)\) 的复杂度。

结论:

\[\large T(n)=\begin{cases} O(n^d\log _bn)&\log _b a=d\\O(n^d)&\log _ba<d\\O(n^{\log _ba})&\log _ba>d\end{cases} \]

证明:

\[\large\begin{aligned}T(n)&=aT(\frac{n}{b})+f(n)\\&=a(aT(\frac{n}{b^2})+(\frac{n}{b})^d)+n^d\\&=a^2T(\frac{n}{b^2})+n^d(1+\frac{a}{b^d})\end{aligned} \]

用相同的方法将 \(T(n)\) 展开 \(m\) 次,可得:

\[\large\begin{aligned}T(n)&=a^mT(\frac{n}{b^m})+n^d(1+\frac{a}{b^d}+(\frac{a}{b^d})^2+\dots+(\frac{a}{b^d})^{m-1})\end{aligned} \]

展开到最后,显然 \(\frac{n}{b^m}\) 可以取到 \(1\),那么 \(m=\log _bn\)

那么:

\[\large T(n)=a^{\log _bn}T(1)+n^d(1+\frac{a}{b^d}+(\frac{a}{b^d})^2+\dots+(\frac{a}{b^d})^{-1+\log _bn}) \]

\(\frac{a}{b^d}=1\) 时,此时 \(a=b^d\),\(d=log_ba\),代入可得:

\[\large \begin{aligned}T(n)&=a^{\log _bn}+n^{\log _ba}log_bn\\&=n^{\log _ba}+n^{\log _ba}log_bn\\&=n^d(1+\log _bn)\end{aligned} \]

去掉常数项可得当 \(\frac{a}{b^d}=1\) 时,$T(n)=n^d\log _bn $。

\(\frac{a}{b^d}\ne1\) 时,我们令 \(S=1+\frac{a}{b^d}+(\frac{a}{b^d})^2+\dots+(\frac{a}{b^d})^{-1+\log_b n}\)

\[\large S=1+\frac{a}{b^d}+(\frac{a}{b^d})^2+\dots+(\frac{a}{b^d})^{-1+\log_b n} \]

\[\large \frac{a}{b^d}S=\frac{a}{b^d}+(\frac{a}{b^d})^2+\dots+(\frac{a}{b^d})^{\log_b n} \]

\[\large (\frac{a}{b^d}-1)S=(\frac{a}{b^d})^{\log _bn}-1 \]

\[\large S=\frac{(\frac{a}{b^d})^{\log _bn}-1}{\frac{a}{b^d}-1} \]

\[\large \begin{aligned}T(n)&=a^{\log _bn}+n^d\frac{(\frac{a}{b^d})^{\log _bn}-1}{\frac{a}{b^d}-1}\\&=n^{\log _ba}+\frac{n^{\log _ba}-n^d}{\frac{a}{b^d}-1}\\&=\frac{\frac{a}{b^d}n^{\log _ba}-n^d}{\frac{a}{b^d}-1}\end{aligned} \]

\(\frac{a}{b^d}<1\iff \log _ba<d\) 时,显然 \(n^d>\frac{a}{b^d}n^{\log _ba}\),所以近似看作 \(T(n)=n^d=f(n)\),否则 \(T(n)=n^{\log _ba}\)

综上

\[\large T(n)=\begin{cases} O(n^d\log _bn)&\log _b a=d\\O(n^d)&\log _ba<d\\O(n^{\log _ba})&\log _ba>d\end{cases} \]