数据结构与算法之美学习心得3

复杂度分析(上):如何分析、统计算法的执行效率和资源消耗

为什么需要复杂度分析

事后统计法:把代码跑一遍,通过统计、监控来得到算法执行的时间和占用的内存大小。
缺点:
1.测试结果非常依赖测试环境
测试环境中的硬件不同会导致测试结果也不同。
2.测试结果受数据规模的影响很大
数据规模太大,测试代码需要花费的时间就太多了;数据规模太小,反映不出算法的真实性能;对于排序算法,待排序的数据的初始有序度也会影响测试结果。

大O复杂度表示法
原理:所有代码的执行时间T(n)与每行代码的执行次数n成正比
公式:T(n)=O(f(n))
n表示数据规模的大小;f(n)表示每行代码执行的次数总和;O表示执行时间T(n)与f(n)表达式成正比。
注: 大O时间复杂度实际上并不表示代码真正的执行时间,而是代码执行时间随数据规模增长的变化趋势,也称作渐进时间复杂度。

时间复杂度分析

由于时间复杂度表示的是代码执行时间随数据规模的增长的变化趋势,所以常量阶、低阶以及系数对增长趋势并无决定性影响,所以可以忽略不计。

分析法则:
1.单段代码看高频:比如循环
2.多段代码取最大:比如一段代码中有单循环和多重循环,那么取多重循环的复杂度
3.嵌套代码求乘积:如递归、多重循环
4.多个规模求加法:比如方法中有两个参数控制两个循环的次数,就取两者复杂度之和

常用的复杂度级别:
多项式阶:随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增长。包括:
O(1)常数阶、O(logn)对数阶、O(n)线性阶、O(nlogn)线性对数阶、O(n2)平方阶、O(n3)立方阶
非多项式阶:随着数据规模的增长,算法的执行时间和空间占有暴增,这类算法性能极差。包括:
O(2n)指数阶、O(n!)阶乘阶

如何掌握复杂度分析方法:多练,孰能生巧

你可能感兴趣的:(数据结构与算法之美学习心得3)