2-algorithm时间复杂度

260 阅读1分钟
// 累加算法
function sumUp(n) {
    let result = 0;

    for (let i = 0; i <= n; i++) {
        result = result + i;
    }
    return result;
}

console.log('sumUp(10)', sumUp(10));

// start = performance.now()
// sumUp(100000)
// end = performance.now()
// end - start
// 0.2099999983329326

// 常数时间复杂度,运行的时间,不受n的限制
function sumUp2(n) {
    return (n / 2) * (n + 1);
}
console.log('sumUp2(10)', sumUp2(10));

// 浏览器中 console 控制台输出的结果
// start = performance.now();
// sumUp2(1000000);
// end = performance.now();
// end - start
// 0.010000003385357559
// start = performance.now();
// sumUp(1000000);
// end = performance.now();
// end - start
// 2.0300000032875687

// 时间复杂度:大O符号表示法
// 常数阶   O(1)
// 线性阶   O(n)
// 对数阶   O(logn)
// 线性对数 O(nlog)
// 平方阶   O(n^2)

// O(1) > O(logn) > O(n) > O(nlogn) > O(n^2)

时间复杂度图示


推导大O符号(渐进分析)

// 推导大O符号(渐进分析)

// 推导线性时间复杂度

// function sumUp(n) {
//     let result = 0;
//     for (let i = 0; i <= n; i++) {
//         result = result + i;
//     }
//     return result;
// }

// n = 1, n = 2, n = 3, n = n;
// 1.假定执行每一行代码的时间是相同的,那么计算代码表达式执行的次数
// 随着n的改变,执行代码的次数的变化趋势

// T = a*n + b; => 线性函数

// 2. 找到最快增长项
// T = a*n

// 3. 去掉系数
// T = n

// 故:O(n)

// 推导常数时间复杂度
// 例子:
// function sumUp2(n) {
//     return (n / 2) * (n + 1);
// }
// n = 1, 执行次数 1
// n = 3, 执行次数 1
// n = 5, 执行次数 1
// n = 7, 执行次数 1
// n = n, 执行次数 1

// T = 1;

// 推导大O符号(渐进分析)

// step1  定义函数       T = 1
// step2  找到最快增长项  T = 1
// step3  去掉系数        T = 1
// 推导出T = 1
// 进而大O符号为:O(1)