【时间复杂度】算法时间复杂度计算

先不上具体的算法,先来理论一下如何去计算一个算法的时间复杂度。

这里给出一个递归关系的表达式,你能够得出具体的复杂度是多少吗?

$f(n)=\begin{cases} 1 & n = 1 \ n + 4f(n/2) & n > 1 \end{cases}$

  • a. $f(n) \in \Theta(n^2)$ ✓

  • b. $f(n) \in \Theta(n)$

  • c. $f(n) \in \Theta(n \log n)$

有三种方法可以去算出来

瞪眼法

你直接猜,别管这个那个的,直接就随便猜一个,然后看答案就完事了

Master theorem

很可惜的是,第一种方法的损失太大了。在一个错一道就扣一个正确的情况下,第一种方法还是太难去成功了。那么这里介绍第二种方法,经典的Master theorem。

Master theorem中定义到,

$T(n)=hT( n/b ) + g(n)$

观察到这个表达式和我的递归表达式差不太多,所以我们也可以将我们的递归表达式套入到这个式子中,

$T(n) = 4T(n/2) + g(n) $

另外我们知道 $g(n) \in \Theta(n^k)$,也就是 $k=1$

我们还知道

$$

T(n) = \begin{cases}

\Theta(n^k) & h < b^k \

\Theta(n\log n) & h = b^k \

\Theta(n^{log_b h}) & h > b^k

\end{cases}

$$

根据上面的式子可以发现,$k= 1$。套入上面公式,也就是 $4 > 2^1 $。这对应了第三种情况,我们把数字替换进去,$\Theta(n^{log_2 4}) $。 计算一下,得出时间复杂度为 $\Theta(n^2) $

不是很难吧。就需要记住公式就好了。


当然,还有第三种方法,我们需要把求和公式给推导出来,这也很简单,请看我操作

求和

我们知道当

$ n = 1$ -> $ \Theta(n) = n + 4T(n/2) $

$ n = 2$ -> $ \Theta(n) = n + 4( n + 4T(n/4))$ -> $ n + 4n + 4^2T(n/2^2) $

$ n = 3$ -> $ \Theta(n) = n + 4n + 4^2[(n/2) + 4T(n/2^3)] $ -> $\Theta(n) = n + 4n + 4^2n/2 + 4^3T(n/2^3) $

可以观察到有一个规律,当 $ n = k $ 的时候就是我们需要的结果

$ n = k$ -> $ \Theta(n)$ = $n + \sum_{i=0}^{k}2 ^ i n + 4^{k+1} T(n/2^{k+1}) $

我们公式有了,接下来就是下一个条件了,这个递归条件什么时候才能结束呢?从题目发现当 $ n = 1$ 的时候自然就结束了,那么根据这个条件,我们可以得出 $ n/2^k = 1$ -> $k = log_2 n $

从新替换到求和里,我们最终得出的结果就是 $2^{\log_2 n + 1} $, 结果也还是 $n^2$。

比起第三种方法我还是更加喜欢第二种方法,站在前人的肩膀上去易化困难的题目。

下一次再带来带有代码的例子吧。这次就到这了。


【时间复杂度】算法时间复杂度计算
http://rmrfr.tech/2025/03/20/时间复杂度】算法时间复杂度计算/
作者
OneWhiteThree
发布于
2025年3月20日
许可协议