目录
如何衡量算法好坏
事后统计法:直接跑数据测试
- 优点:一目了然
- 缺点:依赖测试数据;比较依赖于硬件环境
事前分析法:
1.最差的执行情况
2.假设每行语句执行时间一样
3.计算出算法完成所需要的步骤数量
时间复杂度:
用来衡量一个算法的执行,随数据规模增大,而增长的时间成本
- 不依赖于环境因素
如何表示时间复杂度
- 假设要处理的数据规模是n,代码总的执行行数用函数f(n)来表示
- 为了对f(n)进行化简,找到一个变化趋势与之相近的表示法
大O表示法
- c c c, c 1 c1 c1, c 2 c2 c2 都为一个常数
- f ( n ) f(n) f(n)是实际执行代码行数与n的函数
- g ( n ) g(n) g(n)是经过化简,变化趋势与 f ( n ) f(n) f(n) 一致的 n n n的函数
已知f(n)来说,求g(n)
- 表达式中相乘的常量,可以省略
- 多项式中数量规模更小(低次项)的表达式
- 不同底数的对数,渐进上界可以用一个对数的 l o g n log_n logn表示
- 类似的,对数的常数次幂可省略
常见大O表示法:
按时间复杂度从低到高:
- O ( 1 ) O(1) O(1),常量时间,意味着算法时间不随数据规模而变化
- o ( l o g ( n ) ) o(log_(n)) o(log(n)),对数时间
- o ( n ) o(n) o(n),线性时间,算法时间与数据规模成正比
- o ( n ∗ l o g ( n ) ) o(n*log(n)) o(n∗log(n)),拟线性时间
- o ( n 2 ) o(n^2) o(n2)指数时间
- 0 ( n ! ) 0(n!) 0(n!)阶乘
asymptotic upper bound
渐进上界:从某个常数 n 0 n0 n0开始, c ∗ g ( n ) c*g(n) c∗g(n)总是位于 f ( n ) f(n) f(n)上方,那么记作 o ( g ( n ) ) o(g(n)) o(g(n))
asymptotic lower bound
渐进下界:从某个常数 n 0 n0 n0开始, c ∗ g ( n ) c*g(n) c∗g(n)总是位于 f ( n ) f(n) f(n)下方,那么记作 o m i g a ( g ( n ) ) omiga(g(n)) omiga(g(n))
asymptotic tihgt bounds
渐进紧界:从某个常数 n 0 n0 n0开始, f ( n ) f(n) f(n)总是在 c 1 ∗ g ( n ) c1*g(n) c1∗g(n)和 c 2 ∗ g ( n ) c2*g(n) c2∗g(n)之间,记作 z i t a ( g ( n ) ) zita(g(n)) zita(g(n))
空间复杂度
与时间复杂度类似,一般也使用大 o o o表示法来衡量:一个算法执行随数据规模增大,而增长的额外空间成本。
例如:如果需要常数个指针,那么额外占用的空间是 o ( 1 ) o(1) o(1)