定义
主定理(Master Theorem)通常是指在算法分析领域中的一个定理,特别是用于分析递归算法的时间复杂度。
时间复杂度相关定义
在计算机科学中,算法的时间复杂度(time complexity)是一个函数,它定性描述该算法的运行时间。其原理在于,将计算机的每种基本运算(如加减乘除)所需的时间视为常数,然后考察一个算法调用了多大量级的基本运算。时间复杂度常用大 O O 符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。例如,如果一个算法对于任何大小为 n n 的输入,它至多需要 5 n 3 + 3 n 5 n 3 + 3 n 的时间运行完毕,那么它的渐近时间复杂度是 O ( n 3 ) O ( n 3 ) 。
为了计算时间复杂度,我们通常会估计算法的操作单元数量,每个单元执行的时间都是相同的。因此,总运行时间和算法的操作单元数量最多相差一个常量系数。
相同大小的不同输入值仍可能造成算法的执行时间不同,因此我们通常使用算法的最坏情况复杂度(时间复杂度上界),记为 T ( n ) T ( n ) ,定义为任何大小的输入 n n 所需的最大执行时间。另一种较少使用的方法是平均情况复杂度,通常有特别指定才会使用(如用于随机算法)。
对 Bachmann–Landau 符号描述如下:
f ( n ) = O ( g ( n ) ) f ( n ) = O ( g ( n ) ) 表示 g g 是 f f 的上界;
f ( n ) = Ω ( g ( n ) ) f ( n ) = Ω ( g ( n ) ) 表示 g g 是 f f 的下界;
f ( n ) = Θ ( g ( n ) ) f ( n ) = Θ ( g ( n ) ) 表示 g g 是 f f 的上界和下界。
内容
在算法中,假设有递归关系式:
T ( n ) = a T ( n b ) + f ( n ) , a ≥ 1 , b > 1 T ( n ) = a T ( n b ) + f ( n ) , a ≥ 1 , b > 1
其中,n n 为问题规模,a a 为子问题数量,n b n b 为每个子问题的规模(假设每个子问题规模基本一致),f ( n ) f ( n ) 为递归以外的计算。
情况1: 若 ∃ ϵ > 0 ∃ ϵ > 0 ,有 f ( n ) = O ( n log b a − ϵ ) f ( n ) = O ( n log b a − ϵ ) ,则 T ( n ) = Θ ( n log b a ) T ( n ) = Θ ( n log b a )
情况2: 若 ∃ ϵ ≥ 0 ∃ ϵ ≥ 0 ,有 f ( n ) = Θ ( n log b a log ϵ n ) f ( n ) = Θ ( n log b a log ϵ n ) ,则 T ( n ) = Θ ( n log b a log ϵ + 1 n ) T ( n ) = Θ ( n log b a log ϵ + 1 n )
情况3: 若 ∃ ϵ > 0 , c < 1 ∃ ϵ > 0 , c < 1 ,有 f ( n ) = Ω ( n log b a + ϵ ) , a f ( n b ) ≤ c f ( n ) f ( n ) = Ω ( n log b a + ϵ ) , a f ( n b ) ≤ c f ( n ) ,则 T ( n ) = Θ ( f ( n ) ) T ( n ) = Θ ( f ( n ) )
证明
设总复杂度为 T ( n ) T ( n ) ,有
T ( n ) = log b n ∑ i = 0 a i f ( n b i ) T ( n ) = ∑ i = 0 log b n a i f ( n b i )
将上述三种情况分别代入得 T ( n ) T ( n ) 得
T ( n ) = O ( log b n ∑ i = 0 a i ( n b i ) log b a − ϵ ) = O ( n log b a − ϵ log b n ∑ i = 0 ( a b log b a = ϵ ) i ) = O ( n log b a − ϵ log b n ∑ i = 0 b ϵ j ) = O ( n log b a − ϵ ( n ϵ − 1 b ϵ − 1 ) ) = O ( n log b a ) T ( n ) = O ( ∑ i = 0 log b n a i ( n b i ) log b a − ϵ ) = O ( n log b a − ϵ ∑ i = 0 log b n ( a b log b a = ϵ ) i ) = O ( n log b a − ϵ ∑ i = 0 log b n b ϵ j ) = O ( n log b a − ϵ ( n ϵ − 1 b ϵ − 1 ) ) = O ( n log b a )
T ( n ) = Θ ( log b n ∑ i = 0 a i ( n b i ) log b a log k ( n b i ) ) = Θ ( log b n ∑ i = 0 a i ( n log b a b i log b a ) ( log n − log b i ) k ) = Θ ( n log b a log b n ∑ i = 0 ( a b log b a ) i ( log k n − log k b i ) ) = Θ ( n log b a log b n ∑ i = 0 log k n − log k b i ) = Θ ( n log b a ( log b n ⋅ log k n − log b n ∑ i = 0 log k b i ) ) = Θ ( log b n ⋅ log k n ⋅ n log b a − n log b a log b n ∑ i = 0 log k b i ) = Θ ( n log b a log k + 1 n ) T ( n ) = Θ ( ∑ i = 0 log b n a i ( n b i ) log b a log k ( n b i ) ) = Θ ( ∑ i = 0 log b n a i ( n log b a b i log b a ) ( log n − log b i ) k ) = Θ ( n log b a ∑ i = 0 log b n ( a b log b a ) i ( log k n − log k b i ) ) = Θ ( n log b a ∑ i = 0 log b n log k n − log k b i ) = Θ ( n log b a ( log b n ⋅ log k n − ∑ i = 0 log b n log k b i ) ) = Θ ( log b n ⋅ log k n ⋅ n log b a − n log b a ∑ i = 0 log b n log k b i ) = Θ ( n log b a log k + 1 n )
a f ( n b ) ≤ c f ( n ) ⇒ a i f ( n b ) ≤ c i f ( n ) ⇒ T ( n ) ≤ log b n ∑ i = 0 c i f ( n ) ⇒ T ( n ) ≤ f ( n ) ∞ ∑ i = 0 c i ⇒ T ( n ) ≤ ( 1 1 − c ) f ( n ) ⇒ T ( n ) = O ( f ( n ) ) a f ( n b ) ≤ c f ( n ) ⇒ a i f ( n b ) ≤ c i f ( n ) ⇒ T ( n ) ≤ ∑ i = 0 log b n c i f ( n ) ⇒ T ( n ) ≤ f ( n ) ∑ i = 0 ∞ c i ⇒ T ( n ) ≤ ( 1 1 − c ) f ( n ) ⇒ T ( n ) = O ( f ( n ) )
又由于 f ( n ) = Ω ( n log b a + ϵ ) f ( n ) = Ω ( n log b a + ϵ ) ,T ( n ) = Ω ( f ( n ) ) T ( n ) = Ω ( f ( n ) ) ,因此
T ( n ) = Θ ( f ( n ) ) T ( n ) = Θ ( f ( n ) )
综上,定理得证。
应用
一般的递归算法都可以用主定理分析时间复杂度。如大多数分治算法等。下面给出一个具体的问题作为实例。
最小圆覆盖问题 :给定平面上的 n n 个点,求出一个最小的一圆包围所有的点。
对于一个答案,一定有至少两个点在圆上。若不然,则圆可以继续缩小。因此我们只需要找到两个点(作为直径)或三个点即可确定一个最小圆覆盖。
我们用到随机增量法,即将给出的点以随机的顺序进行遍历。{ p i } { p i } 为加入的点集。设前 i − 1 i − 1 个点确定的最小覆盖圆为 C C ,此时加入 p i p i :
若 p i p i 在 C C 内,则最小覆盖圆不变。
若 p i p i 在 C C 外,则其一定在新确定的最小覆盖圆上。此时遍历前 i − 1 i − 1 个点。设当前遍历到 p j p j ,则将 p i , p j p i , p j 确定的圆设为当前最小覆盖圆,并遍历前 j − 1 j − 1 个点,若有点 p k p k 在圆外,则将 p i , p j , p k p i , p j , p k 确定的圆设为当前最小覆盖圆。
可以证明,这样一定能获得一个最小圆覆盖。
设三个循环的复杂度分别为 T 1 ( n ) , T 2 ( n ) , T 3 ( n ) T 1 ( n ) , T 2 ( n ) , T 3 ( n ) 。现在考虑第一层循环,即加入一个点的循环。由于最多只有三个点在最小覆盖圆上,且我们的点是随机加入的,理论上每个点其之前点确定的最小覆盖圆上的概率是相同的,因此点 p i p i 在加入时在当前圆外并调用下层循环的概率是 3 i 3 i 。第二层调用类似。因此计算时间复杂度为
T 1 ( n ) = n ∑ i = 1 3 i T 2 ( i ) + O ( n ) T 2 ( n ) = n ∑ i = 1 3 i T 3 ( i ) + O ( n ) T 3 ( n ) = O ( n ) T 1 ( n ) = ∑ i = 1 n 3 i T 2 ( i ) + O ( n ) T 2 ( n ) = ∑ i = 1 n 3 i T 3 ( i ) + O ( n ) T 3 ( n ) = O ( n )
其中两点及三点确定一个圆可由公式推出,计算量固定可视为常数。
这里每一层对上一层实际上是有 n n 个规模为 1 1 的子问题。由主定理得,最终算法的时间复杂度为 T 1 ( n ) = O ( n ) T 1 ( n ) = O ( n ) 。
PS:tex 写多了感觉不会写 markdown 了……
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!