• 详解时间复杂度计算公式(附例题细致讲解过程)


    这几天开始刷力扣上面的算法题,有些题目上面限制时间复杂度空间复杂度,题目虽然写出来了,但是很没底。印象里数据结构老师讲过一点,沉睡的记忆苏醒了。只记得一个时间复杂度是O(n)空间复杂度S(n)。for循环常常是O(n),具体是怎么算的不清楚。所以在看了相关的视频教学后,总结一下时间复杂度的计算公式,希望能给大家的学习带来帮助!

    目录

    一、什么是时间复杂度 

    二、单层循环时间复杂度计算公式

    三、两层循环时间复杂度计算公式

    四、多层循环时间复杂度计算公式

    方法一:抽象为计算三维物体体积

    方法二:列式求和


    一、什么是时间复杂度 

    时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数. 时间复杂度常用大O表述,不包括这个函数的低阶项和首项系数。

    时间复杂度大小比较:

    时间复杂度分类:

    • 算法完成工作最少需要多少基本操作叫做最优时间复杂度,是一种最乐观最理想的状态。
    • 算法完成工作最多需要多少基本操作叫做最坏时间复杂度,是算法的一个保障。
    • 算法完成工作平均需要多少基本操作叫做平均时间复杂度,它可以均匀全面的评价一个算法的好坏。

    时间复杂度基本计算规则:

    1. 基本操作即只有常数项,认为其时间复杂度为O(1)
    2. 顺序结构,时间复杂度按加法进行计算
    3. 循环结构,时间复杂度按乘法进行计算
    4. 分支结构,时间复杂度取最大值
    5. 判断一个算法效率时,往往只需要关注操作数量的最高次项,其他次要项和常数项可以忽略
    6. 在没有特殊说明时,我们所分析的时间复杂度都是指最坏时间复杂度

    二、单层循环时间复杂度计算公式

     解题步骤

    1. 列出循环趟数t及每轮循环i的变化值
    2. 找到t与i的关系
    3. 确定循环停止条件
    4. 联立两式解方程
    5. 写结果

     例题分析

     例一:

    1. i = n*n;
    2. whlie(i != 1)
    3. i = i/2;

    第一步:列出循环趟数t及每轮循环i的变化值:

    t0123
    in^{2}\frac{n^2}{2}\frac{n^2}{4}\frac{n^2}{8}

    第二步:找到t与i的关系:

     i=\frac{n^{2}}{2^{t}}

    第三步:确定循环停止条件:

    i = 1

    第四步:联立第二步第三步两式解方程:

    \frac{n^{2}}{2^{t}} = 1 \quad\quad n^2 = 2^t \quad\quad t = \log_2n^2

    t = \log_2n^2 = 2\log_2n

    所以得到时间复杂度为:

    T = O(\log_2n)

    例二:

    1. x = 0
    2. while (n>=(x+1)*(x+1))
    3. x = x+1;

    第一步:列出循环趟数t及每轮循环x的变化值:

    t01234
    x01234

    第二步:找到t与x的关系:

     t = x

    第三步:确定循环停止条件:

    n = (x+1)^2

    第四步:联立第二步第三步两式解方程:

    (t +1)^2 = n

    t = \sqrt[]{n}-1

    所以得到时间复杂度为:

    T=O(\sqrt[]{n})

     例三:

    1. int i = 1;
    2. while (i<=n)
    3. i = i *2

    第一步:列出循环趟数t及每轮循环i的变化值:

    t01234
    i01234

    第二步:找到t与x的关系:

     i = 2^t

    第三步:确定循环停止条件:

    i = n

    第四步:联立第二步第三步两式解方程:

    2^t = n

    t = \log_2n

    所以得到时间复杂度为:

    T = O(\log_2n)

     例四:

    1. int i = 0;
    2. while (i*i*i<=n)
    3. i ++;

    第一步:列出循环趟数t及每轮循环i的变化值:

    t01234
    i01234

    第二步:找到t与x的关系:

     i=t

    第三步:确定循环停止条件:

    i^3 = t

    第四步:联立第二步第三步两式解方程:

    t^3 = n

    t = \sqrt[3]{n}

    所以得到时间复杂度为:

    T=O( \sqrt[3]{n})

     例五:

    1. y = 0;
    2. while (y+1)*(y+1) <= n
    3. y = y+1;

    第一步:列出循环趟数t及每轮循环y的变化值:

    t01234
    y01234

    第二步:找到t与x的关系:

     t = y

    第三步:确定循环停止条件:

    (y+1)^2= n

    第四步:联立第二步第三步两式解方程:

    (t +1)^2 = n

    t = \sqrt[]{n}-1

    所以得到时间复杂度为:

    T=O(\sqrt[]{n})

    三、两层循环时间复杂度计算公式

     解题步骤

    1. 列出循环中i的变化值
    2. 列出内层语句的执行次数
    3. 求和,写结果

     例题分析

    例一:

    1. int m=0,i,j;
    2. for (i=1;i<=n;i++)
    3. for(j=1;j<=2*i;j++)
    4. m++;

    第一步列出循环中i的变化值:

    第二步列出内层语句的执行次数:

    i12345......n
    内层语句执行次数246810......2*n次

    第三步 求和,写结果

    2+4+...+2n = \frac{2+2n}{2}n = n(n+1)

    T= O(n^2)

     例二:

    1. for (i=0;i
    2. for(j=0;j
    3. a[i][j] = 0;

    第一步列出循环中i的变化值:

    第二步列出内层语句的执行次数:

    i01234......n-1
    内层语句执行次数mmmmm......m次

    第三步 求和,写结果

    m*(n-1-0+1) = m*n

    T = O(mn)

     例三:

    1. count = 0;
    2. for (k=1;k<=n;k*=2)
    3. for(j=1;j<=n;j++)
    4. count ++;

    这里k*=2,不再是++,所以要先用单层循环求出变换趟数:

    t1234
    k1234

    k = 2^{t-1}

    t = \log_2k +1

    内层每个都是n,求和则可以得到:

    T= O(n\log_2n)

     例四:

    1. for (i=n-1;i>=1;i--)
    2. for(j=1;j<=i;j++)
    3. if A[j] > A [j+1]
    4. A[j]与A[j+1]交换;

    第一步列出循环中i的变化值:

    第二步列出内层语句的执行次数:

    in-1n-2......2
    内层语句执行次数n-2n-3......1次

    第三步 求和,写结果

    \frac{n-2+1}{2}*(n-2) = \frac{n+1}{2}*(n-2)

    T=O(n^2)

    四、多层循环时间复杂度计算公式

    方法一:抽象为计算三维物体体积

    方法二:列式求和

    例一:

    1. for(i=0;i<=n;i++)
    2. for(j=0;j<=i;j++)
    3. for(k=0;k

    方法一:抽象为计算三维物体体积:

     i依赖于n,j依赖于i,k依赖于j,三者都可以看成是n,再由体积公式V = \frac{1}{3}Sh可以求出

    T= O(n^3)

    方法二:列式求和:

    i=0nj=0ik=0j1=i=0nj=0i\(j10+1)=i=0nj=0i\j" role="presentation">i=0nj=0ik=0j1=i=0nj=0i\(j10+1)=i=0nj=0i\j

    \sum_{i=0}^{n}\sum_{j=0}^{i}\j= \sum_{i=0}^{n}\frac{i(i+1)}{2}=\sum_{i=0}^{n}(i^2+i)=\frac{1}{2}\sum_{i=0}^{n}i^2=\frac{1}{2}\sum_{i=0}^{n}i=O(n^3)

    T = O(n^3)

  • 相关阅读:
    【C语言实现】----动态/文件/静态通讯录
    java自定义注解
    训练人工智能机器人的软实力
    php-fpm详解
    【pytorch】torch.nn 与 torch.nn.functional 的区别
    顺序结构程序设计(python)
    Qt图形视图框架:QGraphicsItem详解
    使用nmea+pps为激光雷达做授时,然后使用gtimu协议中的周和周内秒计算imu数据的时间戳,结果相差一秒,同样来自gps时间,到底imu和雷达的时间戳哪个是对的呢
    Linux学习13—网站服务
    第六章【ADFS集成Exchang实现OWA\ECP单点登录SSO】验证AD联合身份验证(ADFS)是否配置成功
  • 原文地址:https://blog.csdn.net/weixin_63866037/article/details/128087397