大O阶的三种规则:
- 用常量1取代运行时间中的所有加法常数
- 只保留最高阶项
- 去除最高阶的常数
- 常数阶
let sum = 0, n = 10; // 语句执行一次
let sum = (1+n)*n/2; // 语句执行一次
console.log(`The sum is : ${sum}`) //语句执行一次
这段代码的执行次数为3,套用规则1,则这个算法的时间复杂度为O(1),也就是常阶数。
- 线性段
let i =0; // 语句执行一次
while (i < n) { // 语句执行n次
console.log(`Current i is ${i}`); //语句执行n次
i++; // 语句执行n次
}
这段代码总共执行了 3n+1 次,因此该算法的时间复杂度是O(n)。
- 对阶性
let number = 1; // 语句执行一次
while (number < n) { // 语句执行logn次
number *= 2; // 语句执行logn次
}
上面的算法中,number每次都放大两倍,我们假设这个循环体执行了m次,那么2^m = n
即m = logn
,所以整段代码执行次数为1 + 2*logn,则f(n) = logn
,时间复杂度为O(logn)。
- 平方阶
for (let i = 0; i < n; i++) { // 语句执行n次
for (let j = 0; j < n; j++) { // 语句执行n^2次
console.log('I am here!'); // 语句执行n^2
}
}
上面的嵌套循环中,代码共执行 2*n^2 + n,则f(n) = n^2
。所以该算法的时间复杂度为O(n^2 )
常用时间复杂度比较
O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)