主定理是分析分治算法时间复杂度很重要的一个定理。
我们之前对于一个递归类的代码进行时间复杂度分析,一般会采用递归树的方式,下面我们先介绍一下递归树的方式,理解之后,再引入主定理的相关内容。
分治的介绍
分治算法总是将问题的规模不断的拆分,以归并排序为例。
假设 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)log4n−1cn2+Θ(nlog43)=i=0∑log4n−1(163)icn2+Θ(nlog43)<i=0∑∞(163)icn2+Θ(nlog43)放缩=1−1631cn2+Θ(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): 渐进正函数,表示分解和合并的代价。
总代价为: 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=0logbn−1ajf(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=0logbn−1ajf(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})<f(n) Θ(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})<f(n) \end{aligned} \right.
T(n)=⎩⎪⎪⎨⎪⎪⎧Θ(nlogba)Θ(nlogbalogn)Θ(f(n))Θ(nlogba)>f(n)Θ(nlogba)=f(n)Θ(nlogba)<f(n)
举个例子:
-
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)。
-
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)=n^2 <f(n)=n2,因此 T ( n ) = Θ ( n 2 ) T(n)=\Theta(n^2) T(n)=Θ(n2),和上面递归树推出来的一样。