复杂度分析可以帮助我们粗略的估计代码运行的时间和所需空间,因此我们用到时间复杂度和空间复杂度这两个指标。
时间复杂度
以几个例子来分析代码的时间复杂度
1、只关注循环执行次数最多的一段代码
function total(n) { // 1
var sum = 0; // 2
for (var i = 0; i < n; i++) { // 3
sum += i; // 4
} //5
} //6
假设每一行代码的执行时间相等,那么第2行代码执行需要t个时刻,第3行代码执行需要n*t个时刻,第4行代码执行需要n*t,最终这段代码的执行时间为(n+n+1)*t,当数据规模n很大时,我们可以忽略常数项,所以最终这段代码的时间复杂度可以表示为O(n)
2、总复杂度等于两级最大的那段代码的复杂度
function total(n) {
// 第一个 for 循环
var sum1 = 0;
for (var i = 0; i < n; i++) { //执行n次
for (var j = 0; j < n; j++) { //执行n^2次
sum1 = sum1 + i + j; //执行n^2次
}
}
// 第二个 for 循环
var sum2 = 0;
for(var i=0;i<1000;i++) { //执行1000次
sum2 = sum2 + i; //执行1000次
}
// 第三个 for 循环
var sum3 = 0;
for (var i = 0; i < n; i++) { //执行n次
sum3 = sum3 + i; //执行n次
}
}
第一个for循环执行了2n^2+n,第二个for循环执行了2000次,第三个for循环执行了2n次,选数量级最大的作为整段代码的复杂度,则结果为O(n^2)
3、常见的时间复杂度理解
(1)O(1)表示常量级时间复杂度,代码的运行时间并不受数据规模n的影响
(2)O(logn)
function total2(n) {
var sum = 0;
for (var i = 1; i <= n; i = i * 2) {
sum += i;
}
}
代码中i的取值为2的倍数,那么i的取值可以用一个等比数列来表示
2^1 2^2 ....... 2^x=n
通过x=log2n就可以计算代码循环的次数,所以代码的时间复杂度为O(logn),底数可以忽略
空间复杂度
空间复杂度也就是代码中的数规模与所需存储空间的关系
举例
function initArr(n) {
var arr = [];
for (var i = 0; i < n; i++) {
arr[i] = i;
}
}
每一次循环都会创建一个空间来存储变量,所以空间复杂度为O(n),同样也可以类比于时间复杂度忽略常数项