算法设计与分析(1. 引论)

课程特点

  • 理论性强
  • 可借助程序实现 (部分)
  • 可以看作是《数据结构》的后续课程

课程作用

  • 一般计算机用户: 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=1ktiei(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)=IDNmaxT(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)=IDNminT(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)=IDNP(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 NN0 时有 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 NN0 时有 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


欢迎留言

你可能感兴趣的:(算法设计与分析课程,算法,开发语言)