什么是时间复杂度
理解时间复杂度的概念、常见类型和计算方法
问题
什么是时间复杂度?如何计算算法的时间复杂度?
解答
时间复杂度衡量的是算法执行语句的次数,而不是程序具体运行的时间。随着输入规模 n 的增大,时间复杂度越大,算法花费的时间越多。
常见的时间复杂度
按增长速度从低到高排列:
- 常数阶 O(1)
- 对数阶 O(log₂n)
- 线性阶 O(n)
- 线性对数阶 O(n log₂n)
- 平方阶 O(n²)
- 立方阶 O(n³)
- k次方阶 O(nᵏ)
- 指数阶 O(2ⁿ)
计算方法
- 选取相对增长最高的项
- 最高项系数化为 1
- 常数用 O(1) 表示
例如:f(n) = 3n⁴ + 3n + 300,则 O(n) = n⁴
通常计算时间复杂度时考虑最坏情况。
三种典型场景
场景 1:执行次数固定
如果算法执行时间不随 n 增长,即使有上千条语句,时间复杂度也是 O(1)。
let x = 1;
while (x < 100) {
x++;
}
执行 100 次是常数,复杂度为 O(1)。
场景 2:嵌套循环
时间复杂度由嵌套层数最多的循环语句中最内层语句决定。
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
// ...code
}
}
外层循环每执行一次,内层循环执行 n 次,时间复杂度为 O(n²)。
场景 3:条件相关的循环
循环次数不仅与 n 有关,还与执行条件有关。
for (var i = 0; i < n && arr[i] != 1; i++) {
// ...code
}
如果 arr[i] 不等于 1,时间复杂度是 O(n);如果 arr[i] 等于 1,循环提前结束,时间复杂度是 O(1)。
关键点
- 时间复杂度表示算法执行语句的次数,不是实际运行时间
- 计算时保留最高次项,系数化为 1,常数用 O(1) 表示
- 嵌套循环的复杂度由最内层循环决定
- 通常分析最坏情况下的时间复杂度
目录