复杂度
时间复杂度:表示算法的执行时间与数据规模之间的增长关系
空间复杂度:表示算法的存储空间与数据规模之间的增长关系
常见的时间复杂度:T(n) = O(f(n)):T(n)表示代码的执行时间,f(n)表示每行代码执行的次数总和,O表示f(n)与T(n)成正比。
时间复杂度
时间复杂度分为多项式量级和非多项式量级
非多项式量级只有两个:O(2n) 和 O(n!)
当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法。
多项式量级
- 常量阶:
O(1)只要代码的执行时间不随 n 增大,这样代码的时间复杂度为O(1) - 对数阶:
O(logn)常见在while循环中
while (i <= n) {
i = i * 2;
}
因为21 22 ... 2x = n,当2x = n时,x = log2n,x 的次数就是这段代码的时间复杂度,所以while语句中时间复杂度通常为O(log2n)
- 线性阶:
O(n) - 线性对数阶:
O(nlogn) - 平方阶:
O(n2)
越高阶复杂度的算法,执行效率越低,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2)
时间复杂度分析
如何分析一段代码的时间复杂度?
- 只关心循环执行次数最多的一段代码
- 总复杂度等于量级最大的那段代码的复杂度
- 嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
时间复杂度分为最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度、均摊时间复杂度。
最好、最坏情况时间复杂度
最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。
最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。