算法时间复杂度
算法时间复杂度是评判算法好坏的重要依据之一,与算法空间复杂度一同作为算法事前分析估算法的主要关注内容。正确地计算时间复杂度,是我们在学习算法设计过程中必不可少的一种能力。
1、算法时间复杂度的定义
在学习计算时间复杂度之前,我们需要对算法时间复杂度的定义有一个明确的认识,公认的算法时间复杂度定义如下:
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。他表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
对于这样用大写O()来表示算法时间复杂度的记法,我们称为大O记法。
2、推导大O阶方法
对于算法时间复杂度的分析,前辈们给出了一个计算步骤,也就是推导大O阶法,步骤如下:
1、用常数1来取代运行次数中的所有加法常数
2、在修改后的运行次数函数中,只保留最高阶项
3、如果最高阶项存在且不为1,则去除与这个最高阶项相乘的常数。
这样得到的结果就是大O阶。以上三步就是一个推导算法时间复杂度的万能公式。
3、常见的时间复杂度
常见的时间复杂度如下表所示
算法执行次数 |
阶 |
非官方术语 |
| 12 | O(1) |
常数阶 |
2n+3 |
O(n) |
线性阶 |
3n2+2n+1 |
O(n2) |
平方阶 |
5log2n+20 |
O(logn) |
对数阶 |
2n+3nlog2n+19 |
O(nlogn) |
nlogn阶 |
| 6n3+2n2+3n+4 | O(n3) |
立方阶 |
| 2n | O(2n) |
指数阶 |
常用时间复杂度所耗费的时间从小到大依次是:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)