# 基本概念
# 算法 (Algorithm)
- 算法是指解决问题的一种方法或一个过程。
- 算法是若干指令的有穷序列,满足性质:
# 程序 (Program)
- 程序是算法用某种程序设计语言的具体实现。
- 程序可以不满足算法的性质 (4) 有限性。
- 例如操作系统,是一个在无限循环中执行的程序,因而不是一个算法。
- 操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序通过特定的算法来实现。该子程序得到输出结果后便终止。
# 算法分析基本概念
- 算法运行所需要的计算机资源的量称为算法的复杂性。
- 算法的时间复杂性T(n);
- 算法的空间复杂性S(n)。
- 其中 n 是问题的规模(输入大小)。
计算算法运行所需资源量的过程称为算法复杂性分析,简称为算法分析。
# 算法的时间复杂性
- 最坏情况下的时间复杂性
Tmax(n)=max
- 最好情况下的时间复杂性
Tmin(n)=min
- 平均情况下的时间复杂性
Tavg(n)=size(I)=n∑P(I)T(I)
其中 I 是问题的规模为 n 的实例,p (I) 是实 例 I 出现的概率。
# 算法渐近复杂性
T(n)→∞,as n→∞;
(T(n)−t(n))/T(n)→0,as n→∞;
t (n) 是 T (n) 的渐近性态,为算法的渐近复杂性。
在数学上, t (n) 是 T (n) 的渐近表达式,是 T (n) 略去低阶项留下的主项。它比 T (n) 简单。
# 渐近分析的记号
在下面的讨论中,对所有n,f(n)≥0,g(n)≥0。
-
渐近上界记号O
O(g(n))={f(n)∣存在正常数c和n0使得对所有n≥n0有:f(n)≤cg(n)}
-
渐近下界记号Ω
Ω(g(n))={f(n)∣存在正常数c和n0使得对所有n≥n0有:0≤cg(n)≤f(n)}
-
非紧上界记号o
o(g(n))={f(n)∣对于任何正常数c>0,存在正数n0>0使得对所有n≥n0有:0≤f(n)≤cg(n)}
等价于 f(n)/g(n)→0,as n→∞
-
非紧下界记号ω
ω(g(n))={f(n)∣对于任何正常数c>0,存在正数n0>0使得对所有n≥n0有:0≤cg(n)≤f(n)}
等价于 f(n)/g(n)→∞,as n→∞
f(n)∈ω(g(n))⟺g(n)∈o(f(n))
-
紧渐近界记号Θ
Θ(g(n))={f(n)∣存在正常数c1,c2和n0使得对所有n≥n0有:c1g(n)≤f(n)≤c2g(n)}
- 注意到,紧渐进和非紧渐进的区别在于常数 c 是不是任意的,渐进是指量级相同,例如2n2,3n2, 而非紧渐进则是量级不同,例如n2,n3
- 同时,上下界不止一个,所以该函数 (例如O(g(n))) 的指向也是不定的,他可以同时代表多个满足条件的多项式,详见下文
- 定理 1:Θ(g(n))=O(g(n))∩Ω(g(n))
# 渐近分析记号在等式和不等式中的意义
- f(n)=Θ(g(n)) 的确切意义是:f(n)∈Θ(g(n))
- 一般情况下,等式和不等式中的渐近记号Θ(g(n)) 表示Θ(g(n)) 中的某个函数。
# 渐近分析记号的若干性质
- 传递性
- f(n)=Θ(g(n)),g(n)=Θ(b(n))⟹f(n)=Θ(b(n))
- 上述Θ 可换成任意其他四个符号
- 反身性
- f(n)=Θ(f(n))
- f(n)=O(f(n))
- f(n)=Ω(f(n))
- 对称性
f(n)=Θ(g(n))⟺g(n)=Θ(f(n))
- 互对称性
- f(n)=O(g(n))⟺g(n)=Ω(f(n))
- f(n)=o(g(n))⟺g(n)=ω(f(n))
算术运算
- O(f(n))+O(g(n))=O(max{f(n),g(n)})
证明
- 对于任意 f1(n)∈O(f(n)), 存在正常数c1 和自然数n1, 使得对所有n≥n1,有f1(n)≤c1f(n) 。
- 类似地,对于任意g1(n)∈O(g(n)) ,存在正常数c2 和自然数n2,使得对所有n≥n2,有g1(n)≤c2g(n) 。
- 令c3=max{c1,c2},n3=max{n1,n2},h(n)=max{f(n),g(n)} 。
- 则对所有的 n≥n3,有
f1(n)+g1(n)≤c1f(n)+c2g(n)
≤c3f(n)+c3g(n)=c3(f(n)+g(n))
≤c3 2max{f(n),g(n)}
=2c3h(n)=O(max{f(n),g(n)})
- O(f(n))+O(g(n))=O(f(n)+g(n))
证明
- 对于任意 f1(n)∈O(f(n)), 存在正常数c1 和自然数n1, 使得对所有n≥n1,有f1(n)≤c1f(n) 。
- 类似地,对于任意g1(n)∈O(g(n)) ,存在正常数c2 和自然数n2,使得对所有n≥n2,有g1(n)≤c2g(n) 。
- 令c3=max{c1,c2},n3=max{n1,n2} 。
- 则对所有的 n≥n3,有
f1(n)+g1(n)≤c1f(n)+c2g(n)
≤c3f(n)+c3g(n)=c3(f(n)+g(n))
=O(f(n)+g(n))
- O(f(n))×O(g(n))=O(f(n)×g(n))
证明
- 对于任意 f1(n)∈O(f(n)), 存在正常数c1 和自然数n1, 使得对所有n≥n1,有f1(n)≤c1f(n) 。
- 类似地,对于任意g1(n)∈O(g(n)) ,存在正常数c2 和自然数n2,使得对所有n≥n2,有g1(n)≤c2g(n) 。
- 令c3=max{c1,c2},n3=max{n1,n2} 。
- 则对所有的 n≥n3,有
f1(n)×g1(n)≤c1f(n)×c2g(n)
≤c1×c2f(n)×g(n)=c3(f(n)×g(n))
O(f(n)×g(n))
- g(n)=O(f(n))⟹O(f(n))+O(g(n))=O(f(n))
证明
- 对于任意 f1(n)∈O(f(n)), 存在正常数c1 和自然数n1, 使得对所有n≥n1,有f1(n)≤c1f(n) 。
- 对于任意g(n)∈O(f(n)) ,存在正常数c2 和自然数n2,使得对所有n≥n2,有g(n)≤c2f(n) 。
- 对于任意g1(n)∈O(g(n)) ,存在正常数c3 和自然数n2,使得对所有n≥n3,有g1(n)≤c3g(n) 。
- 令c4=max{c1,c2×c3},n4=max{n1,n2,n3} 。
- 则对所有的 n≥n4,有
O(f(n))+O(g(n))=f1(n)+g1(n)≤c1f(n)+c3g(n)
≤c1f(n)+c3×c2f(n)
≤c4f(n)
=O(f(n))
- O(cf(n))=O(f(n)), 其中 c 为正常数
证明
- 对于任意 f1(n)∈O(cf(n)), 存在正常数c1 和自然数n1, 使得对所有n≥n1,有f1(n)≤c1cf(n) 。
- 令c2=max{c1c,c1,c} 。
- 则对所有的 n≥n1,有
f1(n)≤c1cf(n)
≤c2f(n)=O(f(n))
- f(n)=O(f(n))
证明
渐进上界记号定义为:
O(g(n))={f(n)∣存在正常数c和n0使得对所有n≥n0有:f(n)≤cg(n)}
取g(n)=f(n),c=1, 代入即可
# 算法渐近复杂性分析中常用函数
- alogbc=alogblogc=alogalogc×logbloga=a(logalogc)(logbloga)=clogbloga=clogba
- n!=2πn(en)n(1+Θ(n1))
- n!=2πn(en)neαn,12n+11<αn<12n1
- n!=o(nn)
- n!=ω(2n)
- log(n!)=Θ(nlogn)
# 算法分析的基本法则
# 非递归算法:
- for /while 循环
循环体内计算时间 * 循环次数;
- 嵌套循环
循环体内计算时间 * 所有循环次数;
- 顺序语句
各语句计算时间相加;
- if-else 语句
if 语句计算时间和 else 语句计算时间的较大者。