复习的时候周杰伦和陈奕迅真是比红牛还管用。
附上我的工作环境嘻嘻:
上正菜:
算法复杂度渐进分析
分治法思想
- 将问题划分为一数量的子问题;
- 递归地解决子问题,直到子问题的规模足够小可以直接求解;
- 将子问题的解合并来得到原问题的解。
递归法时间复杂度分析
扩展法
通常适用于比较简单的表达式
例子:
T
(
n
)
=
{
θ
(
1
)
i
f
n
=
1
;
2
T
(
n
/
2
)
+
Θ
(
n
)
i
f
n
>
1.
T(n) = \left\{ \begin{matrix} & \theta(1) \quad if \quad n=1; \\ & 2T(n/2) + \Theta(n) \quad if \quad n > 1. \end{matrix} \right.
T(n)={θ(1)ifn=1;2T(n/2)+Θ(n)ifn>1.
扩展法步骤如下:
T
(
n
)
=
2
T
(
n
/
2
)
+
c
1
n
=
4
T
(
n
/
4
)
+
2
c
1
n
/
2
+
c
1
n
=
8
T
(
n
/
8
)
+
4
c
1
n
/
4
+
2
c
1
n
/
2
+
c
1
n
…
=
2
k
T
(
n
/
2
k
)
+
c
1
n
(
n
+
n
+
⋯
+
n
)
i
f
(
n
/
2
k
)
=
=
1
t
h
e
n
T
(
n
)
=
c
2
2
k
+
c
1
(
n
+
n
+
.
.
.
+
n
)
k
=
l
o
g
n
T
(
n
)
=
Θ
(
c
2
n
+
c
1
n
l
o
g
n
)
=
Θ
(
n
l
o
g
n
)
T(n) = 2T(n/2)+ c_1n \\ = 4T(n/4) + 2c_1n/2 + c_1n \\ = 8T(n/8)+4c_1n/4+2c_1n/2+c_1n \\ \dots \\ =2^k T(n/2^k) + c_1n(n+n+\dots+n) \\ if \quad (n/2^k) == 1 \quad then \\ T(n) = c_2 2^k+ c_1(n+n+...+n) \\ k = logn \\ T(n) = \Theta(c_2n+c_1nlogn) = \Theta(nlogn)
T(n)=2T(n/2)+c1n=4T(n/4)+2c1n/2+c1n=8T(n/8)+4c1n/4+2c1n/2+c1n…=2kT(n/2k)+c1n(n+n+⋯+n)if(n/2k)==1thenT(n)=c22k+c1(n+n+...+n)k=lognT(n)=Θ(c2n+c1nlogn)=Θ(nlogn)
替换法
这是一种最普遍的方法
- 猜出解的形式
- 通过归纳法验证
- 求解常量
最关键的一步可以用一句话概括:就是证明: T ( n ) T(n) T(n)小于等于比下界还小的,大于等于上界还大的。
ex:
T
(
n
)
=
4
T
(
n
/
4
)
+
Θ
(
n
)
T(n) = 4T(n/4) + \Theta(n)
T(n)=4T(n/4)+Θ(n)
首
先
证
明
T
(
n
)
≤
c
1
n
2
,
当
n
>
n
0
时
恒
成
立
。
T
(
n
)
=
4
T
(
n
/
2
)
+
d
n
≤
4
c
(
n
/
2
)
2
+
d
n
=
c
n
2
+
d
n
首先证明 T(n)\leq c_1n^2, 当n>n_0时恒成立。\\ T(n) = 4T(n/2) + dn \\ \leq 4c(n/2)^2 + dn \\ =cn^2 + dn
首先证明T(n)≤c1n2,当n>n0时恒成立。T(n)=4T(n/2)+dn≤4c(n/2)2+dn=cn2+dn
我们此时无法证明出
T
(
n
)
≤
c
n
2
T_(n) \leq cn^2
T(n)≤cn2的确切形式,因此这种证明方式失败。
因此考虑减去低阶项来增强归纳假设
假
设
T
(
n
)
≤
c
1
n
2
−
c
2
n
f
o
r
n
≥
n
0
P
r
o
o
f
:
T
(
n
)
=
4
T
(
n
/
2
)
+
d
n
≤
4
[
c
1
(
n
/
2
)
2
−
c
2
(
n
/
2
)
]
+
d
n
=
c
1
n
2
−
2
c
2
n
+
d
n
=
c
1
n
2
−
c
2
n
+
(
d
−
c
2
)
n
i
f
T
(
n
)
≤
c
1
n
2
−
c
2
n
t
h
e
n
d
<
c
2
当
d
<
c
2
时
得
证
。
假设T(n) \leq c_1n^2 -c_2n \quad for \quad n\geq n_0 \\ Proof: \\ T(n) = 4T(n/2) + dn \\ \leq 4[c_1(n/2)^2-c_2(n/2)]+dn \\ = c_1n^2-2c_2n+dn \\ = c_1n^2 - c_2n + (d-c_2)n\\ if \quad T(n)\leq c_1n^2-c_2n\\ then \quad d<c_2 \\ 当d<c_2时得证。
假设T(n)≤c1n2−c2nforn≥n0Proof:T(n)=4T(n/2)+dn≤4[c1(n/2)2−c2(n/2)]+dn=c1n2−2c2n+dn=c1n2−c2n+(d−c2)nifT(n)≤c1n2−c2nthend<c2当d<c2时得证。
附上一个完整证明,还是直接写爽!
递归树
有时替换法非常棘手,因为它主要考观察和猜测
我们可以通过使用递归树来帮助我们观察,并通过替换法去证明我们观测结果的正确与否。
ex: T ( n ) = T ( n / 2 ) + Θ ( n ) T(n) = T (n/2) + \Theta(n) T(n)=T(n/2)+Θ(n)
主方法
(太难记了,不建议使用)