- 算法复杂性的概念
- 用特征方程解递归方程的通解
一、算法复杂性的概念
1、衡量算法优劣的指标
在探讨算法复杂性之前了解一下如何评价一个算法的优劣。衡量算法优劣的指标主要如下:
- 正确性
- 健壮性
- 可读性
- 简单性
- 复杂性(包括时间和空间)
由于期末考试不涉及其他四个性质的考核,因此只对算法复杂性做说明。
2、算法的复杂性
算法复杂性=算法运行所需要的计算机资源的量。
C
=
F
(
N
,
I
,
A
)
C=F(N,I,A)
C=F(N,I,A)
其中C表示算法复杂性,N表示算法要解决的问题规模,I表示算法输入,A表示应用的算法。
算法需要的时间资源为时间复杂性,空间(存储器)的量为空间复杂性。由于不在考点内,不再赘述。
3、渐进符号
该部分主要考察渐进符号以及相关定义的证明,
- 定义1-O: 如果存在正整数 c c c和 n 0 n_0 n0使得对于任意正整数 n ≥ n 0 n\geq n_0 n≥n0都有 T ( n ) ≤ c f ( n ) T(n)\leq cf(n) T(n)≤cf(n), 则称 f ( n ) f(n) f(n)为 T ( n ) T(n) T(n)的渐进上界,记作 T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))。
- 定义2 Ω \Omega Ω: 如果存在正整数 c c c和 n 0 n_0 n0使得对于任意正整数 n ≥ n 0 n\geq n_0 n≥n0都有 T ( n ) ≥ c f ( n ) T(n)\geq cf(n) T(n)≥cf(n), 则称 f ( n ) f(n) f(n)为 T ( n ) T(n) T(n)的渐进下界,记作 T ( n ) = Ω ( f ( n ) ) T(n)=\Omega(f(n)) T(n)=Ω(f(n))。
- 定义3 Θ \Theta Θ : 当 T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))且 T ( n ) = Ω ( f ( n ) ) T(n)=\Omega(f(n)) T(n)=Ω(f(n))时记作 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n)),通常情况下证明过程中选择的 c c c是相同的,但是根据实际情况一般会有不同的 n 0 n_0 n0。
- 定义4-o: 如果存在正整数 c c c和 n 0 n_0 n0使得对于任意正整数 n ≥ n 0 n\geq n_0 n≥n0都有 T ( n ) < c f ( n ) T(n)< cf(n) T(n)<cf(n), 则称 f ( n ) f(n) f(n)为 T ( n ) T(n) T(n)的渐进上界,记作 T ( n ) = o ( f ( n ) ) T(n)=o(f(n)) T(n)=o(f(n))。
- 定义5 ω \omega ω: 如果存在正整数 c c c和 n 0 n_0 n0使得对于任意正整数 n ≥ n 0 n\geq n_0 n≥n0都有 T ( n ) > c f ( n ) T(n)> cf(n) T(n)>cf(n), 则称 f ( n ) f(n) f(n)为 T ( n ) T(n) T(n)的渐进下界,记作 T ( n ) = ω ( f ( n ) ) T(n)=\omega(f(n)) T(n)=ω(f(n))。
例如2022-2023学年第一学期的考题中的第一题: 给出渐进上界 O O O的定义,并证明: 3 n 2 + 4 n = O ( n 2 ) 3n^{2} +4n=O(n^2) 3n2+4n=O(n2)。
二、用特征方程解递归方程的通解
1、K阶程序书线性齐次递归方程
K阶程序书线性齐次递归方程是指给定
K
+
1
K+1
K+1项之间的递推关系和前K项值的递归方程。形式如下,其中
b
i
b_i
bi 为常数。
{
f
(
n
)
=
a
1
f
(
n
−
1
)
+
a
2
f
(
n
−
2
)
+
.
.
.
+
a
k
f
(
n
−
k
)
f
(
0
)
=
b
0
f
(
1
)
=
b
1
.
.
.
f
(
k
)
=
b
k
\begin{cases} f(n)=a_1f(n-1) + a_2f(n-2) + ... + a_kf(n-k) \\ f(0)=b_0 \\ f(1)=b_1 \\ ...\\ f(k)=b_k \end{cases}
⎩
⎨
⎧f(n)=a1f(n−1)+a2f(n−2)+...+akf(n−k)f(0)=b0f(1)=b1...f(k)=bk
在上式中用
x
n
x^n
xn取代
f
(
n
)
f(n)
f(n)并两边同时除以
x
k
x^k
xk 即可得到一元
k
k
k 次方程
x
k
=
a
1
x
k
−
1
+
a
2
x
k
−
2
+
.
.
.
+
a
k
x^k=a_1x^{k-1}+a_2x^{k-2} + ...+a_k
xk=a1xk−1+a2xk−2+...+ak
对于上述一元
k
k
k 次方程,应有
k
k
k 个解
x
1
,
x
2
,
.
.
.
,
x
k
x_1, x_2, ..., x_k
x1,x2,...,xk,对这些解作如下讨论:
- 如果
k
k
k个解各不相同,即对于所有不相等的
i
,
j
i,j
i,j ,都有
x
i
≠
x
j
x_i \neq x_j
xi=xj,由此可得递推方程的通解如下。
f ( n ) = c 1 x 1 n + c 2 x 2 n + . . . + c k x k n f(n)=c_1x_1^{n} + c_2x_2^n + ... + c_kx_k^n f(n)=c1x1n+c2x2n+...+ckxkn - 如果在这些解中存在
x
i
=
x
i
+
1
=
.
.
.
=
x
i
+
j
=
.
.
.
=
x
i
+
m
(
1
≤
j
≤
m
)
x_i=x_{i+1}=...=x_{i+j}=...=x_{i+m}(1\leq j\leq m)
xi=xi+1=...=xi+j=...=xi+m(1≤j≤m),即有
m
m
m个解是相同的,则在上式中将等号右边的对应项替换成
c
i
+
j
n
j
x
j
n
c_{i+j}n^jx_j^n
ci+jnjxjn。将上式改写为
f ( n ) = c 1 x 1 n + . . . + ( c i + c i + j n j + . . . + c i + m n m ) x n + . . . + c k x k n f(n)=c_1x_1^{n} + ... + (c_i + c_{i+j}n^j + ... + c_{i+m}n^m)x^n + ... + c_kx_k^n f(n)=c1x1n+...+(ci+ci+jnj+...+ci+mnm)xn+...+ckxkn
如果有多组相同解则都按照同样的方法替换
由待定系数将通式代入
f ( 0 ) = b 0 f ( 1 ) = b 1 . . . f ( k ) = b k f(0)=b_0 \\ f(1)=b_1 \\ ...\\ f(k)=b_k f(0)=b0f(1)=b1...f(k)=bk
解方程组即可得到所有系数。
2、k阶常系数线性非齐次递归方程组
k阶常系数线性非齐次递归方程组是指形式如下的方程组:
{
f
(
n
)
=
a
1
f
(
n
−
1
)
+
a
2
f
(
n
−
2
)
+
.
.
.
+
a
k
f
(
n
−
k
)
+
g
(
n
)
f
(
0
)
=
b
0
f
(
1
)
=
b
1
.
.
.
f
(
k
)
=
b
k
\begin{cases} f(n)=a_1f(n-1) + a_2f(n-2) + ... + a_kf(n-k)+g(n) \\ f(0)=b_0 \\ f(1)=b_1 \\ ...\\ f(k)=b_k \end{cases}
⎩
⎨
⎧f(n)=a1f(n−1)+a2f(n−2)+...+akf(n−k)+g(n)f(0)=b0f(1)=b1...f(k)=bk
其通解形式为
f
(
n
)
=
f
(
n
)
‾
+
f
∗
(
n
)
f(n)=\overline{f(n)}+f^*(n)
f(n)=f(n)+f∗(n),其中
- f ( n ) ‾ \overline{f(n)} f(n) 为对应齐次递归方程的通解
-
f
∗
(
n
)
f^*(n)
f∗(n)为原非齐次递归方程的特解
对于特解 f ∗ ( n ) f^*(n) f∗(n)分以下两种情况
(1)当g(n)为n的m次多项式
假如在方程中的g(n)形如
g
(
n
)
=
b
1
n
m
+
b
2
n
m
−
1
+
.
.
.
+
b
m
n
+
b
m
+
1
g(n)=b_1n^m+b_2n^{m-1}+...+b_mn+b_{m+1}
g(n)=b1nm+b2nm−1+...+bmn+bm+1
此时特解也是n的m次多项式,形如
f
∗
(
n
)
=
A
1
n
m
+
A
2
n
m
−
1
+
.
.
.
+
A
m
n
+
A
m
+
1
f^*(n)=A_1n^m+A_2n^{m-1}+...+A_mn+A_{m+1}
f∗(n)=A1nm+A2nm−1+...+Amn+Am+1
其中
A
i
(
1
≤
i
≤
m
+
1
)
A_i (1\leq i\leq m+1)
Ai(1≤i≤m+1)为待定的常系数。将此表达式代入原递归方程及初始条件即可解得特解。再将该特解与待定系数的通解合并并代入初始条件则可解得非齐次方程组的通解。
(2)当g(n)含有指数函数时
假如在方程中的g(n)形如
g
(
n
)
=
(
b
1
n
m
+
b
2
n
m
−
1
+
.
.
.
+
b
m
n
+
b
m
+
1
)
a
n
g(n)=(b_1n^m+b_2n^{m-1}+...+b_mn+b_{m+1})a^n
g(n)=(b1nm+b2nm−1+...+bmn+bm+1)an
其中
a
a
a和
b
i
b_i
bi都为常数,此时根据a的值分类讨论:
- 假如a不是特征方程的重根,特解形式与 g ( n ) g(n) g(n)相同,即假设待定系数的表达式 f ∗ ( n ) = ( A 1 n m + A 2 n m − 1 + . . . + A m n + A m + 1 ) a n f^*(n)=(A_1n^m+A_2n^{m-1}+...+A_mn+A_{m+1})a^n f∗(n)=(A1nm+A2nm−1+...+Amn+Am+1)an
- 假如a是特征方程的 r r r 重特征根,特解形式如下 f ∗ ( n ) = ( A 1 n m + A 2 n m − 1 + . . . + A m n + A m + 1 ) n r a n f^*(n)=(A_1n^m+A_2n^{m-1}+...+A_mn+A_{m+1})n^ra^n f∗(n)=(A1nm+A2nm−1+...+Amn+Am+1)nran
关于算法设计与分析第一章复杂度和特征方程求解就介绍到这里。