导读
我们都知道,数据结构和算法本身解决的是“快”和“省”的问题。所以,执行效率是算法一个非常重要的考量指标。那如何来衡量你编写的算法代码的执行效率呢?这里就要用到我们今天要讲的内容:时间、空间复杂度分析。
1、什么是复杂度分析
复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。
2、为什么要进行复杂度分析
复杂度分析有不依赖执行环境*、成本低、效率高、易操作、指导性强的特点。
掌握复杂度分析,有利于编写出性能更优的代码,降低系统开发和维护成本。
3、如何进行复杂度分析
3.1、大O表示法
T(n) = O(f(n))
算法的执行时间与每行代码的执行次数成正比,其中T(n)表示算法执行总时间,f(n)表示每行代码执行总次数,而n往往表示数据的规模。
3.2 、复杂度分析法则
单段代码看高频
比如循环。
多段代码取最大
比如一段代码中有单循环和多重循环,那么取多重循环的复杂。度。
嵌套代码求乘积
比如递归、多重循环等。
多个规模求加法
比如方法有两个参数控制两个循环的次数,那么这时就取二者复杂度相加。
4、常用的复杂度级别
4.1、多项式阶
随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增长。如:O(1)(常数阶)、O(logn)(对数阶)、O(n)(线性阶)、O(nlogn)(线性对数阶)、O(n2)(平方阶)、O(n3)(立方阶)
4.2、非多项式阶
随着数据规模的增长,算法的执行时间和空间占用暴增。如:O(2^n)(指数阶)、O(n!)(阶乘阶)
5、最好、最坏、平均、均摊时间复杂度
最坏情况时间复杂度
代码在最理想情况下执行的时间复杂度。
最好情况时间复杂度
代码在最坏情况下执行的时间复杂度。
平均时间复杂度
用代码在所有情况下执行的次数的加权平均值表示。
均摊时间复杂度
在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。