主定理(时间复杂度计算方式)

Master Theorem

用途

一种用于计算递归时间复杂度的定理。
比如对于一个时间复杂度递推式:\(T(n)=T(n/2)+O(n)\),
可以浅显地看出它的复杂度为\(O(nlog_2n)\),因为我们这样子的递归写了太多次了。
但我们可以看到\(T(n)=4T(n/2)+n\),
它的复杂度是多少?也是\(O(nlog_2n)\)
当在问出这种问题时,我们就会有点束手无策。
所以我们就需要一个定理来把这种问题解决。

定理

对于一个时间复杂度递推式的一般式\(T(n)=aT(n/b)+O(n^d)\):
\(T(n)=\begin{cases} O(n^d) & d>log_b^a \\ O(n^dlog_2^n) & d=log_b^a \\ O(n^{log_b^a}) & d<log_b^a \end{cases}\)

应用

回到一开始的例子:\(T(n)=4T(n/2)+n\)
这时\(a=4,b=2,d=1\),
所以\(log_b^a=2>d\),则\(T(n)=O(n^{log_b^a})=O(n^2)\).
这个故事告诉我们,
像二分这样的形式不要在里面套太大的常数,
不然真的会爆炸。

我们在给出一个例子:\(T(n)=4T(n/2)+n^2\)
这时\(a=4,b=2,d=2\),
所以\(log_b^a=2=d\),则\(T(n)=O(n^dlog_2^n)=O(n^2log_2^n)\).

还有一种:\(T(n)=4T(n/2)+n^3\)
这时\(a=4,b=2,d=3\),
所以\(log_b^a=2<d\),则\(T(n)=O(n^d)=O(n^3)\).

总的来说就是谁大跟谁,等大加\(log_2^n\).

THE END.

posted @ 2023-09-16 08:22  Ian8877  阅读(269)  评论(0编辑  收藏  举报