基本概念
时间复杂度并不是指程序的运行时间,而是指程序的运行次数。当有多种算法去解决同一个问题时,就可以用时间复杂度去衡量每个算法的效率,算法中基本语句重复执行的次数是问题规模 n 的某个函数 f(n),通常表示为 T(n) = O(f(n))。
常见类型
- 常数阶 O(1)
如果运行时间不随着元素 n 的增长而增长,就叫做常数阶。此类算法的时间复杂度为 O(1)。
var x = 10;
console.log(x);
以上程序执行次数不是一个相对数,即不随着 N 的增长而增长,所以为常数阶。
- 对数阶 O(log2 n)
function func(n) {
for (var i = 2; i < n; i++) {
i *= 2;
console.log(i);
}
}
假设循环次数为 t,则循环条件满足 2^t < n。可以得出,执行次数t = log(2)(n),即 T(n) = log(2)(n),可见时间复杂度为 O(log(2)(n)),即 O(log n)。
- 线性阶 O(n)
var n = 10;
for(var i = 0;i<n;i++){
console.log(i);
}
以上程序执行的次数随着 N 的变化而变化,表示为 O(n × 1),即 O(n)。
- 平方阶 O(n^2)
function func(n) {
for (var i = 0; i < n; i++) {
for (var j = i; j < n; j++) {
console.log("Hello World");
}
}
}
以上两次循坏执行次数为 n*n ,因此为 平方阶 O(n^2)。
- 立方阶 O(n^3)
function func(n) {
for (var i = 0; i < n; i++) {
for (var j = i; j < n; j++) {
for (var k = j; k < j; k++) {
console.log("Hello World");
}
}
}
}
以上两次循坏执行次数为 n * n * n ,因此为平方阶 O(n^3)。