课程特点
- 理论性强
- 可借助程序实现 (部分)
- 可以看作是《数据结构》的后续课程
课程作用
- 一般计算机用户: 0
- 初级程序员/软件外包: 3
- 高级程序员: 8
- 研究人员/系统分析师: 10
关于学习的层次
- 听课、道听途说
- 阅读、思考
- 做题、应考
- 讨论
- 讲授、出题
- 研究、创新
- 著书立说
课程目标
- 做题
- 讨论、方案对比
- 程序实现
- 算法具体应用
第 1 章 算法引论
1.1 算法与程序
- 算法是指解决问题的方法或过程.
- 程序是算法用某种程序设计语言的具体实现.
- 联系:见程序的定义.
- 区别:算法更抽象. 另外, 算法除了可以用程序来实现(描述外), 还可用自然语言方式、表格方式、流程图方式等.
算法的基本特征
- 输入 (0~ N N N个): 0 个输入的算法不具有通用性, 但有用, 如计算 π \pi π
- 输出 (1~ N N N个): 不可能没有输出(结果)
- 确定性: 指令清晰、无歧义, 但并不表示每次运行算法都会获得同样结果. 如并行算法, 涉及文件系统的批处理算法
- 有限性: 每条指令执行次数、执行每条指令时间均有限, 因此算法所需总时间也有限
- 注意: 程序不一定具备有限性, 如操作系统程序
1.2 表达算法的抽象机制
- 数据: 基本数据 (布尔值、字符、整数、浮点数等). 矩阵、集合等较复杂数据均由基本数据构成
- 运算: 逻辑运算、关系运算、矩阵运算等. Matlab (Matrix laboratory) 就是以矩阵运算为基础
- 算法用程序描述的基本方法:自顶向下, 逐步求精
1.3 描述算法 (Java语言概述)
- 参见 Java 程序设计基础
1.4 算法的复杂性分析
- 时间复杂度与空间复杂度(对资源的消耗)
- 记法: T = T ( N , I , A ) T = T(N, I, A) T=T(N,I,A) 或 T ( A ) = T ( N , I ) T(A) = T(N, I) T(A)=T(N,I) 或 $T = T(N, I)#
- 含义:算法 A A A 的时间复杂度由问题规模 N N N 和输入 I I I 确定
复杂度的计算
- 设算法在抽象计算机上运行, 有 k k k 种元运算, 记为 O 1 , O 2 , … , O k O_1, O_2, \dots, O_k O1,O2,…,Ok, 它们的运行时间依次为 t 1 , t 2 , … , t k t_1, t_2, \dots, t_k t1,t2,…,tk, 算法 A A A 执行这些运算的平均次数依次为 e 1 , e 2 , … , e k e_1, e_2, \dots, e_k e1,e2,…,ek, 它们由 N N N 和 I I I 确定, 因此记为 e i = e i ( N , I ) e_i = e_i (N, I) ei=ei(N,I)
- T ( N , I ) = ∑ i = 1 k t i e i ( N , I ) T(N, I) = \sum_{i=1}^k t_i e_i(N, I) T(N,I)=i=1∑ktiei(N,I)
- 最坏情况 T max ( N ) = max I ∈ D N T ( N , I ) = T ( N , I ∗ ) T_{\max}(N) = \max_{I \in D_N} T(N, I) = T(N, I^*) Tmax(N)=I∈DNmaxT(N,I)=T(N,I∗)
- 最好情况 T min ( N ) = min I ∈ D N T ( N , I ) = T ( N , I ~ ) T_{\min}(N) = \min_{I \in D_N} T(N, I) = T(N, \tilde{I}) Tmin(N)=I∈DNminT(N,I)=T(N,I~)
- 平均情况 T a v g ( N ) = ∑ I ∈ D N P ( I ) T ( N , I ) T_{\mathrm{avg}}(N) = \sum_{I \in D_N} P(I) T(N, I) Tavg(N)=I∈DN∑P(I)T(N,I)
- 最有价值的是最坏情况. Why?
复杂性渐近态
- 对于 T ( N ) T(N) T(N), 如果存在 T ∗ ( N ) T^*(N) T∗(N), 使得当 N → ∞ N \to \infty N→∞ 有 T ( N ) − T ∗ ( N ) T ( N ) = 0 \frac{T(N)-T^*(N)}{T(N)} = 0 T(N)T(N)−T∗(N)=0, 那么就称 T ∗ ( N ) T^*(N) T∗(N) 是 T ( N ) T(N) T(N) 当 N → ∞ N \to \infty N→∞ 时的渐近性态. 如
- T ( N ) = 3 N 2 + 4 N log N + 7 T(N) = 3N^2 + 4 N \log N + 7 T(N)=3N2+4NlogN+7, 则 T ∗ ( N ) = 3 N 2 T^*(N) = 3N^2 T∗(N)=3N2 为一个答案
- 如果存在正常数
C
C
C 和自然数
N
0
N_0
N0, 使得当
N
≥
N
0
N \geq N_0
N≥N0 时有
f
(
N
)
≤
C
g
(
N
)
f(N) \leq Cg(N)
f(N)≤Cg(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) 的阶 - 该表示方法只是表明 f ( N ) f(N) f(N) 的阶不高于 g ( N ) g(N) g(N) 的阶, 如 N 2 = O ( N 3 ) N^2 = O(N^3) N2=O(N3);
- 这里等于号只是一种记法, 并不具有通常情况下的自反性, 如: 由 N 2 = O ( N 2 ) N^2 = O(N^2) N2=O(N2) 推导出 O ( N 2 ) = N 2 O(N^2) = N^2 O(N2)=N2, O ( N 3 ) = O ( N 2 ) O(N^3)=O(N^2) O(N3)=O(N2) 就是不正确的.
- 一般来说 g ( N ) g(N) g(N) 应比 f ( N ) f(N) f(N) 看起来简单明了
- O O O 的实质是得到算法规模 N N N 相当大时算法的复杂性上界 (忽略常数系数), 是为评估、比较算法的优劣而引入. 这个上界的阶越低则评估越准确, 结果越有价值. 如:证明一个算法的复杂度为 O ( N 1.9 ) O(N^{1.9}) O(N1.9)就比证明它为 O ( N 2 ) O(N^2) O(N2) 有价值(通常也会更困难)
- 如果存在正常数
C
C
C 和自然数
N
0
N_0
N0, 使得当
N
≥
N
0
N \ge N_0
N≥N0 时有
f
(
N
)
≥
C
g
(
N
)
f(N) \ge C g(N)
f(N)≥Cg(N), 则记
f ( N ) = Ω ( g ( N ) ) f(N) = \Omega(g(N)) f(N)=Ω(g(N)) - 如果
f
(
N
)
=
O
(
g
(
N
)
)
f(N) = O(g(N))
f(N)=O(g(N)) 且
f
(
N
)
=
Ω
(
g
(
N
)
)
f(N) = \Omega(g(N))
f(N)=Ω(g(N)), 那么称f(N) 与g(N)同阶, 记为
f ( N ) = Θ ( g ( N ) ) f(N) = \Theta(g(N)) f(N)=Θ(g(N))
彩蛋
- N 2 = O ( N 2 ) N^2 = O(N^2) N2=O(N2) 这种记法合理吗? 如果不合理, 应该使用哪个符号?
1.5 习题
- 1-1 说明下面的swap为什么无法交换实际参数的值
public static void sway(int x, int y){
int temp = x;
x = y;
y = temp;
}
-
1-4 求下列函数的渐近表达式:
3 n 2 + 10 n 3n^2 + 10n 3n2+10n
n 2 / 10 + 2 n n^2/10+ 2n n2/10+2n
21 + 1 / n 21 + 1/n 21+1/n
log n 3 \log n^3 logn3
10 log 3 n 10 \log 3^n 10log3n -
1-7 按照渐近阶从低到高的顺序排列以下表达式:
4 n 2 , log n , 3 n , 20 n , 2 , n 2 / 3 4n^2, \log n, 3^n , 20n , 2, n^{2/3} 4n2,logn,3n,20n,2,n2/3
又 n ! n! n! 应排在哪一位? -
1-8 (1) 假设某算法在输入规模为n时的计算时间为 T ( n ) = 3 × 2 n T(n) = 3 × 2n T(n)=3×2n. 在某台计算机上实现并完成该算法的时间为 t t t 秒. 现有另一台计算机, 其运行速度为第一台的 64 倍, 那么在这台新机器上用同一算法在 t t t 秒内能解输入规模多大的问题?
(2) 若上述算法的计算时间改进为 T ( n ) = n 2 T(n) = n^2 T(n)=n2, 其余条件不变, 则在新机器上用 t t t 秒时间能解输入规模多大的问题?
(3) 若上述算法的计算时间进一步改进为 T ( n ) T(n) T(n) = 8, 其余条件不变, 那么在新机器上用t秒时间能解输入规模多大的问题? -
1-9 硬件厂商 XYZ 公司宣称他们最新研制的微处理器运行速度与其竞争对手 ABC 公司同类产品的 100 倍. 对于计算复杂性分别为 n n n, n 2 n^2 n2, n 3 n^3 n3 和 n ! n! n! 的各算法, 若用 ABC 公司的计算机能在 1 小时内能解输入规模为 n n n 的问题, 那么用 XYZ 公司的在 1 小时内分别能解输入规模为多大的问题?
-
1-10 对于下列各组函数 f ( n ) f(n) f(n) 和$ g(n)$, 确定 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n)) 或 f ( n ) = Ω ( g ( n ) ) f(n) = \Omega(g(n)) f(n)=Ω(g(n)) 或 f ( n ) = Θ ( g ( n ) ) f(n) = \Theta(g(n)) f(n)=Θ(g(n)), 并简述理由.
(1) f ( n ) = log n 2 , g ( n ) = log n + 5 f(n) = \log n^2, g(n) = \log n + 5 f(n)=logn2,g(n)=logn+5
(2) f ( n ) = log n 2 , g ( n ) = n 1 / 2 f(n) = \log n^2, g(n) = n^{1/2} f(n)=logn2,g(n)=n1/2
(3) f ( n ) = n , g ( n ) = log 2 n f(n) =n, g(n) = \log 2^n f(n)=n,g(n)=log2n
(4) f ( n ) = n log n + n , g ( n ) = log n f(n) =n \log n + n, g(n) = \log n f(n)=nlogn+n,g(n)=logn
欢迎留言