困扰我好久的时间复杂度理解,从接触这个概念到今天已经实习,我从来没理解过到底啥是时间复杂度。
今天在公司看代码感觉有点恶心了,看了会儿时间复杂度相关的事情,有了一点儿理解,做个笔记。
时间复杂度:
时间复杂度衡量的是一个算法在执行时间(速度)上的优劣,
一个程序运行的总时间主要和两点有关:
- 执行每条语句的耗时
- 执行每条语句的频率-即执行次数
执行次数的表达式一般是冗长的数学表达式,例如一个三层循环的程序,内循环的执行次数为 N(N-1)(N-2) = N^3/6-N^2/2+N/3,一般在这种表达式中首项之后的其他项都相对较小(例如,当N=1000时,-N^2/2+N/3远小于N^3/6),所以我们忽略那些影响很小的,只抓住影响最大的那一项进行分析。
所以,
时间复杂度是运算次数表达式中受N的变化影响最大的那一项。
计算方法:
- 找到算法中的基本语句
- 算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。
- 计算基本语句的执行次数的数量级;
- 只需计算基本语句执行次数的数量级,原因是上面提到的可以忽略那些影响小的项。
- 用大Ο记号表示算法的时间性能
- 将基本语句执行次数的数量级放入大Ο记号中。
for (i=1; i<=n; i++)
x++;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;
常见时间复杂度:
描述 | 时间复杂度 | 说明 |
常数级别 | O(1) | 普通语句 |
对数级别 | O(logN) | 二分策略 |
线性级别 | O(N) | 循环 |
线性对数级别 | O(NlogN) | 分治(归并排序) |
平方级别 | O(N^2) | 双层循环 |
立方级别 | O(N^3) | 三层循环 |
指数级别 | O(2^N) | 穷举查找(检查所有子集) |