概述
- 一般情况下,算法中的基本操作语句的重复执行次数是问题规模 n 的某个函数,用 T(n)表示,若有某个辅
助函数 f(n),使得当 n 趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称 f(n)是 T(n)的同数量级函数。
记作 T(n)=O( f(n) ),称O( f(n) ) 为算法的渐进时间复杂度,简称时间复杂度。 - T(n) 不同,但时间复杂度可能相同。 如:T(n)=n²+7n+6 与 T(n)=3n²+2n+2 它们的 T(n) 不同,但时间复杂
度相同,都为 O(n²)。 - 计算时间复杂度的方法:
- 用常数 1 代替运行时间中的所有加法常数 T(n)=n²+7n+6 => T(n)=n²+7n+1
- 修改后的运行次数函数中,只保留最高阶项 T(n)=n²+7n+1 => T(n) = n² 去除最高阶项的系数 T(n) = n² => T(n) = n² => O(n²)
常见时间复杂度
- 常数阶 O(1)
- 对数阶 O(log2n)
- 线性阶 O(n)
- 线性对数阶 O(nlog2n)
- 平方阶 O(n^2)
- 立方阶 O(n^3)
- k 次方阶 O(n^k)
- 指数阶 O(2^n)
- 常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)< Ο(nk) <
Ο(2n) ,随着问题规模 n 的不断增大,上述时间复杂度不断增大,算法的执行效率越低
详细说明
- 常数阶 O(1)
自上而下执行,无循环
- 对数阶 O(log2n)
while(i < n) {
i = i * 2;
}
while循环中i = i * 2
则i离n越来越近, 越来越快结束。log3n也是对数阶
- 线性阶 O(n)
一层循环
for(int i = 0; i < n; i ++) {
// ...
}
- 线性对数阶 O(nlog2n)
一层循环套对数阶
for(int i = 0; i < n; i ++) {
while(j < n) {
j = j * 2;
}
}
- 平方阶 O(n^2)
两层循环
for(int i = 0; i < n; i ++) {
for(int j = 0; j < n; j ++) {
// ...
}
}
- 立方阶 O(n^3)
三层循环
- k 次方阶 O(n^k)
K层循环
- 指数阶 O(2^n)