一. 时间复杂度

评价标准:▶ 运行时间 ▶ 运算步骤 ▶ 增长量级

1.运行时间

运行时间随机器而异,它是由机器本身软硬件环境决定的,与算法无关。我们更多的讨论影响运行时间的另一个因素—运算步骤。

2.运算步骤

① 什么是运算步骤?

基本运算(加,减,乘,除,余,判断,数组的读取,写入,函数调用等)发生的次数。

②优点

机器无关,具有解释力

③缺点

计数繁琐,求解有难度,函数复杂

④注意

算法复杂度主要考虑输入规模较大的情形,此时具体的增长函数不是那么重要,关键是其增长量级。

3.增长量级(Order of growth)

假设某算法的执行步骤 f(n) 跟输入的规模的关系为 f(n) = 3n2+150n+10000,影响最大的项为3n2。能否用n2表示?为什么?

基本可以,但是不完全可以。

为什么基本可以?

当n很大时,后面的项(增长速度慢)不重要。

为什么不完全可以?

只用n2表示不了后面的项,也表示不了系数。

① 增长量级的近似表示

下界(Big-Ω):Ω(n2) 表示存在常数 c 使得当 n >= n0 时,cn2 =< f(n)

上界(Big-O):O(n2) 表示存在常数 c 使得当 n >= n0 时,cn2 >= f(n)

确界(Big-θ):θ(n2) 表示存在常数 c1、c2 使得当 n >= n0 时,c1n2 <= f(n) <= c2n2

② 常见的时间复杂度

  • O(1) ——常数阶
  • O(log2n) ——对数阶
  • O(n) ——线性阶
  • O(nlog2n) ——nlogn阶
  • O(n2) ——平方阶
  • O(nk) ——k方阶
  • O(2n) ——指数阶
  • O(n!) ——阶乘阶

③ 算法复杂度分析的三种情形

算法的运算次数并非固定不变,而有随机因素。如搜索,运气好一次找到,运气差最后找到。

  • 最好情形(Best cae)
  • 最差情形(Worst case)
  • 平均情形(Average case)

例:从已经排好序的数组A中,查找某个数是否在A中,若在,返回其位置。

对于分治法:得到结果时,数据规模为1。此时应满足 n/2t-1 = 1,t 表示比较次数。化简得到 t = log2n+1。

比较次数 1 2 3 4 5
数据规模 n n/2 n/4 n/23 n/24

枚举法和分治法分别的花费次数:

类型 BC AC WC
Brute force approach(枚举法) 1 n/2 n
Divide and conquer(分治法) 1 log2n/2+1 log2n+1

例子:斐波那锲数列迭代,递归的方式各自的时间复杂度。

迭代:O(n)

递归:O(2n) (实际上是二叉树的结点个数)

二. 空间复杂度

暂无

参考文章

算法的时间复杂度和空间复杂度-总结

十分钟弄懂:数据结构与算法之美 - 时间和空间复杂度

算法笔记:Big-O的两张图

斐波那契数列的递归与循环实现及复杂度分析