前言
这是分析复杂度的一个玩意儿,东西不多,原本只要死记一下就好了,但是考虑到我不太好的记忆力,所以还是解析一遍比较好
正文
主定理是用来分析
T
(
n
)
=
a
T
(
n
b
)
+
f
(
n
)
T(n)=aT(\frac nb)+f(n)
T(n)=aT(bn)+f(n)满足
a
,
b
≥
1
a,b\ge1
a,b≥1的复杂度的
其实感觉也挺好分析的
考虑
T
(
n
)
T(n)
T(n)的瓶颈问题
假设
a
T
(
n
b
)
>
>
f
(
n
)
aT(\frac nb)>>f(n)
aT(bn)>>f(n)
那么
T
(
1
)
=
O
(
1
)
,
T
(
n
)
=
a
T
(
n
b
)
=
a
l
o
g
b
n
=
Θ
(
n
l
o
g
b
a
)
T(1)=\mathcal O(1),T(n)=aT(\frac nb)=a^{log_bn}=\Theta(n^{log_ba})
T(1)=O(1),T(n)=aT(bn)=alogbn=Θ(nlogba)
因为要满足
a
T
(
n
b
)
>
>
f
(
n
)
aT(\frac nb)>>f(n)
aT(bn)>>f(n),所以此时的条件为
f
(
n
)
=
O
(
n
l
o
g
b
a
−
ϵ
)
,
ϵ
>
0
f(n)=\mathcal O(n^{log_ba-\epsilon}),\epsilon>0
f(n)=O(nlogba−ϵ),ϵ>0
即当
f
(
n
)
=
O
(
n
l
o
g
b
a
−
ϵ
)
,
ϵ
>
0
f(n)=\mathcal O(n^{log_ba-\epsilon}),\epsilon>0
f(n)=O(nlogba−ϵ),ϵ>0时,
T
(
n
)
=
Θ
(
n
l
o
g
b
a
)
T(n)=\Theta(n^{log_ba})
T(n)=Θ(nlogba)
假设
a
T
(
n
b
)
<
<
f
(
n
)
aT(\frac nb)<<f(n)
aT(bn)<<f(n)
因为前者的
n
n
n会变小,使得
f
(
x
)
f(x)
f(x)差的非常快,所以显然瓶颈在后者
所以当
f
(
n
)
=
O
(
n
l
o
g
b
a
+
ϵ
)
,
ϵ
>
0
f(n)=\mathcal O(n^{log_ba+\epsilon}),\epsilon>0
f(n)=O(nlogba+ϵ),ϵ>0时,
T
(
n
)
=
Θ
(
f
(
n
)
)
T(n)=\Theta(f(n))
T(n)=Θ(f(n))
然后我们考虑一下
f
(
n
)
=
O
(
n
l
o
g
b
a
)
f(n)=\mathcal O(n^{log_ba})
f(n)=O(nlogba)的情况
那么
T
(
1
)
=
O
(
1
)
,
T
(
n
)
=
a
T
(
n
b
)
+
O
(
n
l
o
g
b
a
)
T(1)=\mathcal O(1),T(n)=aT(\frac nb)+O(n^{log_ba})
T(1)=O(1),T(n)=aT(bn)+O(nlogba)
这个东西列出来其实不好算,但是我们可以脑补一下这个递归大概有logn层,也许会想到假如
a
、
b
a、b
a、b的数值极端怎么办,但其实后面的
n
l
o
g
b
a
n^{log_ba}
nlogba已经保证了结论的正确性,大雾
所以最后的复杂度是
Θ
(
f
(
n
)
l
o
g
n
)
\Theta(f(n)logn)
Θ(f(n)logn)
在实际写的时候可以设
f
(
n
)
=
O
(
n
l
o
g
b
a
l
o
g
k
n
)
f(n)=\mathcal O(n^{log_ba}log^kn)
f(n)=O(nlogbalogkn),那么
T
(
n
)
=
Θ
(
n
l
o
g
b
a
l
o
g
k
+
1
n
)
T(n)=\Theta(n^{log_ba}log^{k+1}n)
T(n)=Θ(nlogbalogk+1n)
总结
对于
T
(
n
)
=
a
T
(
n
b
)
+
f
(
n
)
T(n)=aT(\frac nb)+f(n)
T(n)=aT(bn)+f(n),满足
a
,
b
≥
1
a,b\ge1
a,b≥1
T
(
n
)
=
{
Θ
(
n
l
o
g
b
a
)
f
(
n
)
=
O
(
n
l
o
g
b
a
−
ϵ
)
,
ϵ
>
0
Θ
(
n
l
o
g
b
a
l
o
g
k
+
1
n
)
f
(
n
)
=
O
(
n
l
o
g
b
a
l
o
g
k
n
)
Θ
(
f
(
n
)
)
f
(
n
)
=
O
(
n
l
o
g
b
a
+
ϵ
)
,
ϵ
>
0
T(n)=\begin{cases} \Theta(n^{log_ba})&f(n)=\mathcal O(n^{log_ba-\epsilon}),\epsilon>0\\ \Theta(n^{log_ba}log^{k+1}n)&f(n)=\mathcal O(n^{log_ba}log^kn)\\ \Theta(f(n))&f(n)=\mathcal O(n^{log_ba+\epsilon}),\epsilon>0 \end{cases}
T(n)=⎩⎪⎨⎪⎧Θ(nlogba)Θ(nlogbalogk+1n)Θ(f(n))f(n)=O(nlogba−ϵ),ϵ>0f(n)=O(nlogbalogkn)f(n)=O(nlogba+ϵ),ϵ>0
后记
本篇文章一些符号不怎么严谨,仅能表意,主要是写一个推的方法,如果有什么好的建议欢迎在评论提出
另外如果有更好的理解方式,也欢迎与我交流
2019.10.17:之前有一些错误进行了改正