美文网首页
【学习笔记 一】: 算法时间复杂度

【学习笔记 一】: 算法时间复杂度

作者: 麻烦来一大碗猫 | 来源:发表于2021-07-15 19:11 被阅读0次

先看一个例子,1 + 2 + 3 + ... + n,进行循环累加

function sum1 (n) {
    let sum = 0; /* 执行1次 */
    for(let i = 0; i <= n; i ++) { /* 执行n + 1次 */
        sum = sum + i; /* 执行n次 */
    }
    return sum;
}

一共执行 2n + 2次;
若我们换种写法:

function sum2 (n) {
    return (1 + n) * n / 2; /* 执行1次 */
}

相比之下,很明显sum2的方法要效率更高一些,当n越来越大,sum1的执行次数会越来越高,sum2永远都执行一次,时间效率的差异也就越来越大。

函数的渐进增长

输入n fn1(n) 2n + 3 fn1'(n) 2n fn2(n) 3n + 1 fn2'(n) 3n
n = 1 5 2 4 3
n = 2 7 4 7 6
n = 3 9 6 10 9
n = 10 23 20 31 30
n = 100 203 200 301 300
n = 1000 2003 2000 3001 3000

可以看到,当输入参数n > 2后,fn1的执行次数与fn2的执行次数的差距越来越大,fn1明显要优于fn2。
给定两个函数f(n) 与 g(n),如果存在一个整数N,使得对于所有的 n > N,且f(n)总是比g(n)大,那么我们说f(n)的增长渐进快于g(n);

同时我们可以看见,当输入参数逐渐增大的时候,常数部分对算法执行次数的变化,影响不大,所以我们可以忽略加法常数

输入n fn3(n) 4n + 5 fn3'(n) n fn4(n) 2n * n + 4 fn4'(n) n * n
n = 1 9 1 5 1
n = 2 13 2 12 6
n = 3 17 3 22 9
n = 10 45 10 204 30
n = 100 405 100 20004 10000
n = 1000 4005 1000 2000004 1000000

随着n的增大,fn4的增长速度明显快于fn3,且常数的影响也越来越小,fn4以指数形势增长,所以n * n项中与之相乘的常数项对于函数的增长速度影响不大,所以说,可以忽略与最高次项相乘的常数项并且最高次项的指数越大,该函数的增长速度越快,其算法执行次数就越多且越复杂

输入n fn3(n) 2n^2 + 4n + 5 fn3'(n) n^2 fn4(n) n^3 + 2n^2 + 4 fn4'(n) n^3
n = 1 9 1 7 1
n = 2 21 4 20 8
n = 3 35 9 22 70
n = 10 245 100 204 1204
n = 100 20405 10000 1020004 1000000
n = 1000 2004005 1000000 1002000004 1000000000

当最高次项的次数不一样时,也可以看到当他的次数越大,函数的增长速度越快,所以判断一个算法的效率, 函数中的常数和其他次要项常常可以忽略,更应该关注主项即最高阶项的阶数

这时候我们可以引进算法时间复杂度的概念

算法时间复杂度

算法语句的执行次数T(n)是关于问题规模n的函数,进而分析Tn(n)随着n的增长并确定T(n)的数量级。算法时间复杂度,也就是算法的时间度量,记做T(n) = O(f(n))。它表示随问题规模的增大,算法执行时间的增长率和f(n)的增长率相同, 其中f(n)是问题规模n的某个函数。
通常记做O();例如上述的fn1为O(n),sum2为O(1)。

推导算法时间复杂度遵守三个原则:

  1. 用常数1 取代运行时间肿的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果高阶项存在且系数不为1,则去除愚者莪项相乘的系数。

常数阶

如sum2的算法时间复杂度就为常数阶,记做O(1);

线性阶

如sum1的算法时间复杂度就为线性阶,记做O(n);

平方阶

function sum3(n) {
    for(let i = 0; i <= n; i++) {
        for(let j = 0; j <= n; j++) {
            /* 算法时间复杂度为O(1)的逻辑 */
        }
    }
}

为平方阶,记做O(n^2);

对数阶

function sum4(n) {
    let sum = 1;
    while(sum < n) {
        sum = sum * 2
    }
}

我们设置执行次数为x,当前2^x = n; 所以x = log2 n
记做O(log n);

算法时间复杂度从小到大一次是
O(1) < O(log n) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)

相关文章

  • 算法的时间复杂度分析

    学习算法的读书笔记据说, 学习算法时, 时间复杂度是精髓, 把时间复杂度搞清楚, 算法就学成一半了? 为什么要学习...

  • 时间复杂度和空间复杂度笔记

    复杂度分析笔记 复杂度主要分为时间和空间复杂度 时间复杂度:算法(程序)执行的时间变化趋势 空间复杂度:算法(程序...

  • 《架构师训练营》之数据结构、网络通信、数据库原理

    极客时间《架构师训练营》第八周学习笔记 数据结构与算法 空间复杂度和时间复杂度 算法的优劣主要从算法的执行时间和所...

  • 【学习笔记 一】: 算法时间复杂度

    先看一个例子,1 + 2 + 3 + ... + n,进行循环累加 一共执行 2n + 2次;若我们换种写法: 相...

  • 《如何计算一个程序的时间和空间复杂度》

    本文为自己的学习笔记,仅供自我学习,学习资料极客时间的王争的《算法与数据结构之美》。 一.基础概念 时间复杂度表示...

  • 算法相关

    算法复杂度相关概念:漫画:什么是时间复杂度?算法的时间复杂度和空间复杂度详解算法题库:力扣 一、排序算法 排序算法...

  • 算法基础知识

    算法的复杂度 算法的复杂度: 算法的时间复杂度和空间复杂度合称为算法的复杂度,一般不特别说明,讨论的时间复杂度均是...

  • 四种算法思想(上)- 分治、回溯

    四种算法思想 学习算法,有两个比较重要的基础要学习。 首先是复杂度的计算。复杂度包括时间复杂度和空间复杂度,通过对...

  • 数据结构与算法学习-复杂度分析

    前言 这一篇笔记主要记录总结了什么是算法复杂度?、为什要做算法复杂度分析?、如何做算法复杂度分析?、常用的复杂度级...

  • 算法复杂度

    算法复杂度 算法复杂度的目的:分析代码执行的时间成本。我们从五个方面来介绍算法复杂度:时间复杂度、时间复杂度分类、...

网友评论

      本文标题:【学习笔记 一】: 算法时间复杂度

      本文链接:https://www.haomeiwen.com/subject/qfempltx.html