•
算法时间复杂度的定义:在进行算法分析时,语句总的执行次数
T(n)
是关于问题规模
n
的函数,进而分析
T(n)
随
n
的变化情况并确定
T(n)
的数量级。算法的时间复杂度,也就是算法的时间量度,记作:
T(n)=O(f(n))
。它表示随问题规模
n
的增大,算法执行时间的增长率和
f(n)
的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中
f(n)
是问题规模
n
的某个函数。
•
好长好长,没想到定义这个概念的老家伙比小甲鱼还罗嗦。(关键需要知道执行次数
==
时间)
•
那么如何分析一个算法的时间复杂度呢?即如何推导大
O
阶呢?我们给大家整理了以下攻略:
–
用常数
1
取代运行时间中的所有加法常数。
–
在修改后的运行次数函数中,只保留最高阶项。
–
如果最高阶项存在且不是
1
,则去除与这个项相乘的常数。
–
得到的最后结果就是大
O
阶。
对数阶
inti = 1, n = 100;
while(i < n )
{
i= i*2;
}
•
由于每次
i
*
2
之后,就举例
n
更近一步,假设有
x
个
2
相乘后大于或等于
n
,则会退出循环。
•
于是由
2^x = n
得到
x = log(2)n
,所以这个循环的时间复杂度为
O(
logn
)
。
•
其实理解大
O
推导不算难,难的是对数列的一些相关运算,这更多的是考察你的数学知识和能力。
例子 | 时间复杂度 | 装逼术语 |
5201314 | O(1) | 常数阶 |
3n+4 | O(n) | 线性阶 |
3n^2+4n+5 | O(n^2) | 平方阶 |
3log(2)n+4 | O(logn) | 对数阶 |
2n+3nlog(2)n+14 | O(nlogn) | nlogn阶 |
n^3+2n^2+4n+6 | O(n^3) | 立方阶 |
2^n | O(2^n) | 指数阶 |
•
常用的时间复杂度所耗费的时间从小到大依次是:
O(1) < O(
logn
)< (n) < O(
nlogn
) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(
n^n
)