- 什么是复杂度分析
- 数据结构和算法是解决“如何让计算机更快,更省空间的解决问题”。
- 分别从时间复杂度和空间复杂度两个概念来描述性能问题,而者统称为复杂度。
- 复杂度描述的是算法的执行时间(或占用的存储空间)与数据规模的增长关系。
- 为什么要进行复杂度分析
- 有的人说我可以通过把程序跑一边,然后做统计,就可以知道算法的执行时间和内存大小。但是这种做法是不准确的,因为太过依赖宿主机器的性能,从而一段代码在不同机器上得到不同的结果。
- 复杂度分析有不依赖执行环境、成本低、效率高、易操作的优势。
- 掌握复杂度分析将可以帮助你写出更高效的代码,有利于降低开发和维护成本。
- 如何进行复杂度分析
1)大O表示法
算法的执行时间与每行代码的执行次数成正比,用T(n) = O(f(n))*unit-time 表示,其中T(n)表示算法的执行总时间,f(n)表示每行代码执行的总次数,unit-time 代表每行代码的执行时间(这里假设每行代码的执行时间相同)n代表数据的规模。
2)特点
以时间复杂度为例,由于时间复杂度描述的是算法的执行时间与数据的增长变化趋势,所以常量阶,低阶以及常数,当数据规模n无线大的时候,对结果都不产生决定性影响,所以都可以忽略。
3)复杂度分析法则
a.单段代码看高频:比如循环。
b.多段代码取最大: 比如一段代码中有单循环和多重循环,那么取多重循环的复杂度。
c.嵌套代码求乘积:比如递归,多重循环等。
d.多个数据量增值求加法:比如方法有两个参数控制两个循环的次数,那么这时就取二者复杂度相加。
- 常用的复杂度级别
多项式阶:O(1)(常数阶)、O(logn)(对数阶)、O(n)(线性阶)、O(nlogn)(线性对数阶)、O(n^2)(平方阶)、O(n^3)(立方阶)。随着数据规模的增长,算法的执行时间和占用空间,按照多项式的比例增长。
非多项式阶:O(2^n)(指数阶)O(n!)(阶乘)。随着数据规模的增长,算法的执行时间和空间占用暴增,这类算法性能极差。