复杂度分析(上)
大 O 复杂度表示法
T(n) = O(f(n)),T(n) 表示代码执行的时间;n 表示数据规模的大小;f(n) 表示每行代码执行的次数总和。因为这是一个公式,所以用 f(n) 来表示。公式中的 O,表示代码的执行时间 T(n) 与 f(n) 表达式成正比。
大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。
当 n 很大时,公式中的低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略。我们只需要记录一个最大量级就可以了。
时间复查度分析
- 只关注循环执行次数最多的一段代码
- 加法法则:总复杂度等于量级最大的那段代码的复杂度
- 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
几种常见时间复杂度实例分析
常量阶 O(1) < 对数阶 O(logn) < 线性阶 O(n) < 线性对数阶 O(nlogn) < 平方阶 O(n^2) < 立方阶 O(n^3) < k 次方阶 O(n^k) < 指数阶 O(2^n) < 阶乘阶 O(n!) < O(n^n)
一般时间复杂度到了 2^n (指数阶) 及更大的时间复杂度,这样的算法我们基本上不会用了,太不实用了。平方阶 (n^2) 的算法是勉强能用,而 nlogn 及更小的时间复杂度算法那就是非常高效的算法了啊。
在对数阶时间复杂度的表示方法里,我们忽略对数的「底」,统一表示为 O(logn)。
空间复杂度分析
空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。
我们常见的空间复杂度就是 O(1)、O(n)、O(n2 ),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。
小结
复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的增长关系,可以粗略地表示,越高阶复杂度的算法,执行效率越低。常见的复杂度并不多,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2 )。