第一章:算法概述
1.1算法与程序
算法是指解决问题的一种方法或一个过程。
算法是若干指令的有穷序列,满足性质:
(1)输入:由外部提供的量作为算法的输入。
(2)输出:算法产生至少一个量作为输出。
(3)确定性:组成算法的每条指令是清晰,无歧义的。
(4)有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。
程序是算法用某种程序设计语言的具体实现。
程序可以不满足算法的性质(4)
例如操作系统,是一个在无限循环中执行的程序,因而不是一个算法。
操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序通过特定的算法来实现。该子程序得到输出结果后便终止。
1.2算法复杂性分析
分为空间复杂度和时间复杂度,其中时间复杂性最为重要
时间复杂度又分为最坏,最好,平均时间复杂性,其中最坏时间复杂性最有价值。
时间复杂度
算法运行时所需要的计算机时间资源的量称为时间复杂性。这个量应该集中反应算法的效率,并从运行该算法的实际计算机中抽象出来。换句话说,这个量应该是只依赖于要解的问题的规模、算法的输入和算法本身的函数。
时间复杂性具体定义较为复杂,因而引入了复杂性渐近性态的概念。
设 T ( N ) T(N) T(N) 是一个复杂性函数。一般来说,当 N N N单调递增且趋于 ∞ \infty ∞时, T ( N ) T(N) T(N) 也将单调增加且趋于 ∞ \infty ∞。对于 T ( N ) T(N) T(N),如果存在 T ∼ ( N ) T ^ { \sim } ( N ) T∼(N) ,使得当 N → ∞ N→∞ N→∞时有 ( T ( N ) − T ∼ ( N ) ) / T ( N ) → 0 (T(N)−T ^ { \sim } ( N ))/T(N)→0 (T(N)−T∼(N))/T(N)→0,那么,就说 T ∼ ( N ) T ^ { \sim } ( N ) T∼(N)是 T ( N ) T(N) T(N)当 N → ∞ N→∞ N→∞时的渐近性态,或称 T ∼ ( N ) T ^ { \sim } ( N ) T∼(N)为算法当 N → ∞ N→∞ N→∞的渐近复杂性,而与 T ( N ) T(N) T(N)相区别
直观上,
T
∼
(
N
)
T ^ { \sim } ( N )
T∼(N)是
T
(
N
)
T(N)
T(N)中略去低阶项所留下的主项
(
T
(
N
)
−
T
∼
(
N
)
)
/
T
(
N
)
=
4
N
log
N
+
7
3
N
2
+
4
N
log
N
+
7
→
0
(
N
→
∞
)
( T ( N ) - T ^ { \sim } ( N ) ) / T ( N ) = \frac { 4 N \operatorname { log } N + 7 } { 3 N ^ { 2 } + 4 N \operatorname { log } N + 7 } \rightarrow 0 ( N \rightarrow \infty )
(T(N)−T∼(N))/T(N)=3N2+4NlogN+74NlogN+7→0(N→∞)
在这里,主项
T
∼
(
N
)
=
3
N
2
T ^ { \sim } ( N )=3N^2
T∼(N)=3N2
当要比较的两个算法的渐近复杂性的阶不同时,只要能确定出各自的阶,就可以判定出哪一个算法的效率高,不必关心包含在 T ∼ ( N ) = 3 N 2 T ^ { \sim } ( N )=3N^2 T∼(N)=3N2 中的常数因子
🎡为了与此简化的复杂性分析相匹配,需要引入以下渐近意义下的记号 O , Ω , θ 和 o O , \Omega , \theta \text { 和 } o O,Ω,θ 和 o。
1.关于符号 O O O:如果存在正的常数 C C C和自然数 N 0 N_0 N0 ,使得当 N ≥ N 0 N≥N_0 N≥N0 时有 f ( N ) ≤ C g ( N ) f(N)≤Cg(N) f(N)≤Cg(N) ,则称函数 f ( N ) f(N) f(N)当 N N N充分大时上有界,且 g ( N ) g(N) g(N)是它的一个上界,记为 f ( N ) = O ( g ( N ) ) f(N)=O(g(N)) f(N)=O(g(N))。这时还说 f ( N ) f(N) f(N)的阶不高于 g ( N ) g(N) g(N)的阶。
举几个例子:
(
1
)
因
为
对
于
所
有
的
N
≥
1
有
3
N
≤
4
N
,
所
以
有
3
N
=
O
(
N
)
;
(1)因为对于所有的 N≥1 有 3N≤4N ,所以有 3N=O(N) ;
(1)因为对于所有的N≥1有3N≤4N,所以有3N=O(N);
(
2
)
因
为
当
N
≥
1
时
有
N
+
1024
≤
1025
N
,
所
以
有
N
+
1024
N
=
O
(
N
)
;
(2)因为当 N≥1 时有 N+1024≤1025N ,所以有 N+1024N=O(N) ;
(2)因为当N≥1时有N+1024≤1025N,所以有N+1024N=O(N);
(
3
)
因
为
当
N
≥
10
时
有
2
N
2
+
11
N
−
10
≤
3
N
3
,
所
以
有
2
N
2
+
11
N
−
10
=
O
(
N
2
)
;
(3)因为当 N≥10 时有 2N^2+11N−10≤3N^3 ,所以有 2N^2+11N−10=O(N^2);
(3)因为当N≥10时有2N2+11N−10≤3N3,所以有2N2+11N−10=O(N2);
2.按照符号
O
O
O的定义,容易证明它有如下运算规则:
(
1
)
O
(
f
)
+
O
(
g
)
=
O
(
m
a
x
(
f
,
g
)
)
;
(1)O(f)+O(g)=O(max(f,g));
(1)O(f)+O(g)=O(max(f,g));
(
2
)
O
(
f
)
+
O
(
g
)
=
O
(
f
+
g
)
;
(2)O(f)+O(g)=O(f+g) ;
(2)O(f)+O(g)=O(f+g);
(
3
)
O
(
f
)
O
(
g
)
=
O
(
f
g
)
;
(3)O(f)O(g)=O(fg) ;
(3)O(f)O(g)=O(fg);
(
4
)
如
果
g
(
N
)
=
O
(
f
(
N
)
)
,
则
O
(
f
)
+
O
(
g
)
=
O
(
f
)
;
(4)如果g(N)=O(f(N)) ,则 O(f)+O(g)=O(f) ;
(4)如果g(N)=O(f(N)),则O(f)+O(g)=O(f);
(
5
)
O
(
C
f
(
N
)
)
=
O
(
f
(
N
)
)
,
其
中
C
是
一
个
正
的
常
数
;
(5)O(Cf(N))=O(f(N)) ,其中 C 是一个正的常数;
(5)O(Cf(N))=O(f(N)),其中C是一个正的常数;
(
6
)
f
=
O
(
f
)
。
(6)f=O(f) 。
(6)f=O(f)。
规则 ( 1 ) O ( f ) + O ( g ) = O ( m a x ( f , g ) ) ; (1)O(f)+O(g)=O(max(f,g)); (1)O(f)+O(g)=O(max(f,g));的证明:
设 F ( N ) = O ( f ) F(N)=O(f) F(N)=O(f) 。根据符号 O O O 的定义,存在正常数 C 1 C_{1} C1 和自然数 N 1 N_{1} N1, 使得 对所有的 N ⩾ N 1 N \geqslant N_{1} N⩾N1, 有 F ( N ) ⩽ C 1 f ( N ) F(N) \leqslant C_{1} f(N) F(N)⩽C1f(N) 。
类似地,设
G
(
N
)
=
O
(
g
)
G(N)=O(g)
G(N)=O(g), 则存在正的常数
C
2
C_{2}
C2 和自然数
N
2
N_{2}
N2, 使得对所有的
N
⩾
N
2
N \geqslant N_{2}
N⩾N2, 有
G
(
N
)
⩽
C
2
g
(
N
)
G(N) \leqslant C_{2} g(N)
G(N)⩽C2g(N)
令
C
3
=
max
{
C
1
,
C
2
}
,
N
3
=
max
{
N
1
,
N
2
}
,
h
(
N
)
=
max
{
f
,
g
}
C_{3}=\max \left\{C_{1}, C_{2}\right\}, N_{3}=\max \left\{N_{1}, N_{2}\right\}, h(N)=\max \{f, g\}
C3=max{C1,C2},N3=max{N1,N2},h(N)=max{f,g}, 则对所有的
N
⩾
N
3
N \geqslant N_{3}
N⩾N3, 有
F
(
N
)
⩽
C
1
f
(
N
)
⩽
C
1
h
(
N
)
⩽
C
3
h
(
N
)
F(N) \leqslant C_{1} f(N) \leqslant C_{1} h(N) \leqslant C_{3} h(N)
F(N)⩽C1f(N)⩽C1h(N)⩽C3h(N).
类似地,有
G
(
N
)
⩽
C
2
f
(
N
)
⩽
C
2
h
(
N
)
⩽
C
3
h
(
N
)
\quad G(N) \leqslant C_{2} f(N) \leqslant C_{2} h(N) \leqslant C_{3} h(N)
G(N)⩽C2f(N)⩽C2h(N)⩽C3h(N)。
故有:
O
(
f
)
+
O
(
g
)
=
F
(
N
)
+
G
(
N
)
⩽
C
3
h
(
N
)
+
C
3
h
(
N
)
=
2
C
3
h
(
N
)
=
O
(
h
)
=
O
(
max
(
f
,
g
)
)
\quad \begin{aligned} O(f)+O(g)=F(N)+G(N) \leqslant C_{3} h(N)+C_{3} h(N) =& \\2 C_{3} h(N)=O(h)=O(\max (f, g)) \end{aligned}
O(f)+O(g)=F(N)+G(N)⩽C3h(N)+C3h(N)=2C3h(N)=O(h)=O(max(f,g))
规则 ( 2 ) O ( f ) + O ( g ) = O ( f + g ) ; (2)O(f)+O(g)=O(f+g) ; (2)O(f)+O(g)=O(f+g);的证明:
设 F ( N ) = O ( f ) F(N)=O(f) F(N)=O(f) 。根据符号 O O O 的定义,存在正常数 C 1 C_{1} C1 和自然数 N 1 N_{1} N1, 使得 对所有的 N ⩾ N 1 N \geqslant N_{1} N⩾N1, 有 F ( N ) ⩽ C 1 f ( N ) F(N) \leqslant C_{1} f(N) F(N)⩽C1f(N) 。
类似地,设
G
(
N
)
=
O
(
g
)
G(N)=O(g)
G(N)=O(g), 则存在正的常数
C
2
C_{2}
C2 和自然数
N
2
N_{2}
N2, 使得对所有的
N
⩾
N
2
N \geqslant N_{2}
N⩾N2, 有
G
(
N
)
⩽
C
2
g
(
N
)
G(N) \leqslant C_{2} g(N)
G(N)⩽C2g(N)
令
C
3
=
max
{
C
1
,
C
2
}
,
N
3
=
max
{
N
1
,
N
2
}
C_{3}=\max \left\{C_{1}, C_{2}\right\}, N_{3}=\max \left\{N_{1}, N_{2}\right\}
C3=max{C1,C2},N3=max{N1,N2}, 则对所有的
N
⩾
N
3
N \geqslant N_{3}
N⩾N3, 有:
F
(
N
)
⩽
C
1
f
(
N
)
⩽
C
3
f
(
N
)
G
(
N
)
⩽
C
2
g
(
N
)
⩽
C
3
g
(
N
)
F(N) \leqslant C_{1} f(N) \leqslant C_{3} f(N)\\ G(N) \leqslant C_{2} g(N) \leqslant C_{3} g(N)
F(N)⩽C1f(N)⩽C3f(N)G(N)⩽C2g(N)⩽C3g(N)
故有:
O
(
f
)
+
O
(
g
)
=
F
(
N
)
+
G
(
N
)
≤
C
3
f
(
N
)
+
C
3
g
(
N
)
=
C
3
(
f
(
N
)
+
g
(
N
)
)
=
O
(
f
+
g
)
O(f)+O(g)=F(N)+G(N)≤C_3f(N)+C_3g(N)\\=C_3(f(N)+g(N))=O(f+g)
O(f)+O(g)=F(N)+G(N)≤C3f(N)+C3g(N)=C3(f(N)+g(N))=O(f+g)
规则 ( 3 ) O ( f ) O ( g ) = O ( f g ) (3)O(f)O(g)=O(fg) (3)O(f)O(g)=O(fg)的证明:
设 F ( N ) = O ( f ) F(N)=O(f) F(N)=O(f)。根据符号 O O O的定义,存在正常数 C 1 C_1 C1和自然数 N 1 N_1 N1,使得对所有的 N ≥ N 1 N≥N_1 N≥N1 ,有 F ( N ) ≤ C 1 f ( N ) F(N)≤C_1f(N) F(N)≤C1f(N)。
类似地,设
G
(
N
)
=
O
(
g
)
G(N)=O(g)
G(N)=O(g),则存在正的常数
C
2
C_2
C2和自然数
N
2
N_2
N2 ,使得所有的
N
≥
N
2
N≥N_2
N≥N2 ,有
G
(
N
)
≤
C
2
g
(
N
)
G(N)≤C_2g(N)
G(N)≤C2g(N) 。
令
C
3
=
C
1
∗
C
2
,
N
3
=
max
{
N
1
,
N
2
}
C_3=C_1*C_2, N_{3}=\max \left\{N_{1}, N_{2}\right\}
C3=C1∗C2,N3=max{N1,N2}, 则对所有的
N
≥
N
3
N≥N_3
N≥N3 ,有
F
(
N
)
≤
C
1
f
(
N
)
,
G
(
N
)
≤
C
2
g
(
N
)
F(N)≤C_1f(N),G(N)≤C_2g(N)
F(N)≤C1f(N),G(N)≤C2g(N)
故有:
O
(
f
)
∗
O
(
g
)
=
F
(
N
)
∗
G
(
N
)
≤
C
1
f
(
N
)
∗
C
2
g
(
N
)
=
C
3
∗
f
(
N
)
∗
g
(
N
)
=
O
(
f
∗
g
)
O(f)*O(g)=F(N)*G(N)≤C_1f(N)*C_2g(N)\\=C_3*f(N)*g(N)=O(f*g)
O(f)∗O(g)=F(N)∗G(N)≤C1f(N)∗C2g(N)=C3∗f(N)∗g(N)=O(f∗g)