Algorithm Complexity

算法分析

为什么要进行算法分析?

  • 预测算法所需的资源
    计算时间(CPU 消耗)
    内存空间(RAM 消耗)
    通信时间(带宽消耗)

  • 预测算法的运行时间
    在给定输入规模时,所执行的基本操作数量。
    或者称为算法复杂度(Algorithm Complexity)

如何衡量算法复杂度?

  • 内存(Memory)
  • 时间(Time)
  • 指令的数量(Number of Steps)
  • 特定操作的数量
  • 磁盘访问数量
  • 网络包数量
  • 渐进复杂度(Asymptotic Complexity)

算法的运行时间与什么相关?

  • 取决于输入的数据。(例如:如果数据已经是排好序的,时间消耗可能会减少。)
  • 取决于输入数据的规模。(例如:6 和 6 * 109)
  • 取决于运行时间的上限。(因为运行时间的上限是对使用者的承诺。)

算法分析要保持大局观(Big Idea),其基本思路:

  • 忽略掉那些依赖于机器的常量。
  • 关注运行时间的增长趋势。
复杂度 符号 描述
常量(Constant) O(1) 操作的数量为常数,与输入的数据的规模无关。 n = 1,000,000 -> 1-2 operations
对数(Logarithmic) O(log2 n) 操作的数量与输入数据的规模 n 的比例是 log2 (n)。n = 1,000,000 -> 30 operations
线性(Linear) O(n) 操作的数量与输入数据的规模 n 成正比。 n = 10,000 -> 5000 operations
平方(Quadratic) O(n2) 操作的数量与输入数据的规模 n 的比例为二次平方。 n = 500 -> 250,000 operations
立方(Cubic) O(n3) 操作的数量与输入数据的规模 n 的比例为三次方。 n = 200 -> 8,000,000 operations
指数(Exponential) O(2n) O(kn) O(n!) 指数级的操作,快速的增长。 n = 20 -> 1048576 operations