主定理(Master Theorem)

主定理是分析分治算法时间复杂度很重要的一个定理。

我们之前对于一个递归类的代码进行时间复杂度分析,一般会采用递归树的方式,下面我们先介绍一下递归树的方式,理解之后,再引入主定理的相关内容。

分治的介绍

分治算法总是将问题的规模不断的拆分,以归并排序为例。

假设 T ( n ) T(n) T(n)代表原问题的规模, n n n为输入数据的规模。

第一次拆分后,假设拆分成两份,规模就变成了 n 2 \frac{n}{2} 2n​,然后各自再递归调用归并排序,这部分时间复杂度为 2 T ( n 2 ) 2T(\frac{n}{2}) 2T(2n),最后将这两个排好序的子数组进行合并,所需时间为 Θ ( n ) \Theta(n) Θ(n)

Θ \Theta Θ为同阶, Ω \Omega Ω为下界, O O O为上界。

那么就可以得出:
T ( n ) = { Θ ( 1 ) n = 1 2 T ( n 2 ) + Θ ( n ) n > 1 T(n)= \left \{ \begin{aligned} & \Theta(1) \quad n=1 \\ & 2T(\frac{n}{2})+\Theta(n) \quad n>1 \end{aligned} \right. T(n)=Θ(1)n=12T(2n)+Θ(n)n>1

递归树

T ( n ) = 3 T ( n 4 ) + Θ ( n 2 ) T(n)=3T(\frac{n}{4})+\Theta(n^2) T(n)=3T(4n)+Θ(n2)​为例:



总代价为:

T ( n ) = c n 2 + 3 16 c n 2 + ( 3 16 ) 2 c n 2 + . . . + ( 3 16 ) l o g 4 n − 1 c n 2 + Θ ( n l o g 4 3 ) = ∑ i = 0 l o g 4 n − 1 ( 3 16 ) i c n 2 + Θ ( n l o g 4 3 ) < ∑ i = 0 ∞ ( 3 16 ) i c n 2 + Θ ( n l o g 4 3 ) 放缩 = 1 1 − 3 16 c n 2 + Θ ( n l o g 4 3 ) = 16 13 c n 2 + Θ ( n l o g 4 3 ) Θ ( n l o g 4 3 ) 低阶项 = O ( n 2 ) 上界 \begin{aligned} T(n) &=cn^2+\frac{3}{16}cn_2+(\frac{3}{16})^2cn^2+...+(\frac{3}{16})^{log_4^{n-1}}cn^2+\Theta(n^{log_4^3})\\ &=\sum_{i=0}^{log_4^{n-1}}(\frac{3}{16})^icn^2+\Theta(n^{log_4^3})\\ &<\sum_{i=0}^{\infty}(\frac{3}{16})^icn^2+\Theta(n^{log_4^3}) \quad \text{放缩}\\ &=\frac{1}{1-\frac{3}{16}}cn^2+\Theta(n^{log_4^3}) \\ &=\frac{16}{13}cn^2+\Theta(n^{log_4^3}) \quad \quad \Theta(n^{log_4^3})\text{低阶项}\\ &=O(n^2) \quad \text{上界} \end{aligned} T(n)=cn2+163cn2+(163)2cn2+...+(163)log4n1cn2+Θ(nlog43)=i=0log4n1(163)icn2+Θ(nlog43)<i=0(163)icn2+Θ(nlog43)放缩=11631cn2+Θ(nlog43)=1316cn2+Θ(nlog43)Θ(nlog43)低阶项=O(n2)上界
同时我们知道,每一项都包含 n 2 n^2 n2,并且系数都是正的,那么下界为 T ( n ) = Ω ( n 2 ) T(n)=\Omega(n^2) T(n)=Ω(n2)

主定理

T ( n ) = a T ( n b ) + f ( n ) T(n)=aT(\frac{n}{b})+f(n) T(n)=aT(bn)+f(n)

a: 被分解为a个子问题。

b: >1的整数,表示每次分治,问题规模都被缩小为之前的 1 b \frac{1}{b} b1​。

f ( n ) f(n) f(n): 渐进正函数,表示分解和合并的代价。

主定理(Master Theorem)_第1张图片

总代价为: T ( n ) = Θ ( n l o g b a ) + ∑ j = 0 l o g b n − 1 a j f ( n b j ) T(n)=\Theta(n^{log_b^a})+\sum_{j=0}^{log_b^{n-1}}a^jf(\frac{n}{b^j}) T(n)=Θ(nlogba)+j=0logbn1ajf(bjn)

g ( n ) = ∑ j = 0 l o g b n − 1 a j f ( n b j ) g(n)=\sum_{j=0}^{log_b^{n-1}}a^jf(\frac{n}{b^j}) g(n)=j=0logbn1ajf(bjn) Θ ( n l o g b a ) \Theta(n^{log_b^a}) Θ(nlogba)和之间 f ( n ) f(n) f(n)的大小关系决定了 g ( n ) g(n) g(n)的化简形式。

  • Θ ( n l o g b a ) > f ( n ) \Theta(n^{log_b^a})>f(n) Θ(nlogba)>f(n)
    g ( n ) = O ( n l o g b a ) g(n)=O(n^{log_b^a}) g(n)=O(nlogba)
    那么,
    T ( n ) = Θ ( n l o g b a ) + O ( n l o g b a ) = Θ ( n l o g b a ) ( 同阶 ) \begin{aligned} T(n) &=\Theta(n^{log_b^a})+O(n^{log_b^a})\\ &=\Theta(n^{log_b^a})\quad (\text{同阶}) \end{aligned} T(n)=Θ(nlogba)+O(nlogba)=Θ(nlogba)(同阶)

  • Θ ( n l o g b a ) = f ( n ) \Theta(n^{log_b^a})=f(n) Θ(nlogba)=f(n)​​,
    g ( n ) = Θ ( n l o g b a l o g n ) g(n)=\Theta(n^{log_b^a}logn) g(n)=Θ(nlogbalogn)
    那么,
    T ( n ) = Θ ( n l o g b a ) + Θ ( n l o g b a l o g n ) = Θ ( n l o g b a l o g n ) ( 同阶 ) \begin{aligned} T(n) &=\Theta(n^{log_b^a})+\Theta(n^{log_b^a}logn)\\ &=\Theta(n^{log_b^a}logn)\quad (\text{同阶}) \end{aligned} T(n)=Θ(nlogba)+Θ(nlogbalogn)=Θ(nlogbalogn)(同阶)

  • Θ ( n l o g b a ) < f ( n ) \Theta(n^{log_b^a})Θ(nlogba)<f(n)​​​,
    g ( n ) = Θ ( f ( n ) ) g(n)=\Theta(f(n)) g(n)=Θ(f(n))
    那么,
    T ( n ) = Θ ( n l o g b a ) + Θ ( f ( n ) ) = Θ ( f ( n ) ) \begin{aligned} T(n) &=\Theta(n^{log_b^a})+\Theta(f(n))\\ &=\Theta(f(n)) \end{aligned} T(n)=Θ(nlogba)+Θ(f(n))=Θ(f(n))

综上所述:
T ( n ) = { Θ ( n l o g b a ) Θ ( n l o g b a ) > f ( n ) Θ ( n l o g b a l o g n ) Θ ( n l o g b a ) = f ( n ) Θ ( f ( n ) ) Θ ( n l o g b a ) < f ( n ) T(n)= \left \{ \begin{aligned} &\Theta(n^{log_b^a}) & \Theta(n^{log_b^a})>f(n)\\ &\Theta(n^{log_b^a}logn) & \Theta(n^{log_b^a})=f(n)\\ &\Theta(f(n)) & \Theta(n^{log_b^a})T(n)=Θ(nlogba)Θ(nlogbalogn)Θ(f(n))Θ(nlogba)>f(n)Θ(nlogba)=f(n)Θ(nlogba)<f(n)
举个例子:

  1. T ( n ) = T ( 2 n 3 ) + 1 T(n)=T(\frac{2n}{3})+1 T(n)=T(32n)+1​​

    n l o g b a = n l o g 3 2 1 = 1 n^{log_b^a}=n^{log_\frac{3}{2}^1}=1 nlogba=nlog231=1​​​ 与 f ( n ) = 1 f(n)=1 f(n)=1​​​ 相等,因此 T ( n ) = Θ ( n l o g b a l o g n ) = Θ ( n l o g n ) T(n)=\Theta(n^{log_b^a}logn)=\Theta(nlogn) T(n)=Θ(nlogbalogn)=Θ(nlogn)​。​​

  2. T ( n ) = 3 T ( n 4 ) + n 2 T(n)=3T(\frac{n}{4})+n^2 T(n)=3T(4n)+n2

    n l o g b a = n l o g 4 3 n^{log_b^a}=n^{log_4^3} nlogba=nlog43 < f ( n ) = n 2 <f(n)=n2,因此 T ( n ) = Θ ( n 2 ) T(n)=\Theta(n^2) T(n)=Θ(n2),和上面递归树推出来的一样。​​

你可能感兴趣的:(algorithms,算法,排序算法)