前言

该文章已经进行了一次排版的优化。

关于时间复杂度

在计算机科学中,算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。例如,如果一个算法对于任何大小为 n (必须比n0大)的输入,它至多需要5n3 + 3n的时间运行完毕,那么它的渐近时间复杂度是O(n3)。源自:wikipedia

为了计算时间复杂度,我们通常会估计算法的操作单元数量,每个单元运行的时间都是相同的。因此,总运行时间和算法的操作单元数量最多相差一个常量系数。
Step:

  1. 用常数1替代语句频度中所有的加法项;
  2. 在1 的结果中,只保留数的最高项;
  3. 最高阶项若系数不为1,则去除系数(或是改为1)。

如果你没看懂,那继续往下看,笔者以例子与你详细介绍。
例子1

for(int sum=0,i = 0;i < N;i++)  //1、for(int j = 0;j <N;j++)     //2、sum=sum+i*j;           //3、

我们以一个语句记为1次,来:

  1. 1行这里定义两个变量共一次,而中间循环,理论是判断是N次,但是实际上应该是N+1,最后等于N时还有判断1次 即0~N,故为N+1,循环变量的递增一共是N次,其语句频度为:
    O 1 = 1 + ( N + 1 ) + N (1.1) O_1=1+(N+1)+N \tag{1.1} O1​=1+(N+1)+N(1.1)

  2. 2行这里第一个循环进入第二个循环,一共是N次,那么将会定义N次。单独分析判断语句它将会像第一层循环一样,一个判断N次,再算上第一次循环进入第二次循环共有N次, 故为N * (N+1),后面类似N*N,其语句频度为:
    O 2 = N + N ∗ ( N + 1 ) + N ∗ N (1.2) O_2=N+N*(N+1)+N*N\tag{1.2} O2​=N+N∗(N+1)+N∗N(1.2)

  3. 第二层循环进入最里面语句N次,第一层循环进入第二层循环共N次,故实际为N * N次。其语句频度为:
    O 3 = N ∗ N (1.3) O_3=N*N\tag{1.3} O3​=N∗N(1.3)

  4. 那么将上述的(1.1)、(1.2)、(1.3) 式子求和一下,就得这个程序的总的语句频次,并保留最高项数N * N,就得到了该程序的算法时间复杂度。
    O ( N 2 ) = O 1 + O 2 + O 3 (1.4) O(N^2)=O_1+O_2+O_3\tag{1.4} O(N2)=O1​+O2​+O3​(1.4)

例子2

int j = 0;
for(int sum = 0,i = 1;i < N;i = i*2)   //1、sum = sum+i*j;             //2、

看到这程序片段,你是不是一眼就得出答案了?如果你不注意的话,你的答案肯定是O(N),对了吗?
先告诉你答案为O(log(N)) 不是这个答案的,你可以试试代个确切的N值进去 看一下次数,自己体会一下,那么下面我和大家一起分析下:

  1. 注释1的语句频度为:
    O 1 = 1 + l o g 2 N + 1 + l o g 2 N (2.1) O_1=1+log_2{N}+1+log_2{N}\tag{2.1} O1​=1+log2​N+1+log2​N(2.1)

  2. 注释2的语句频度为:
    O 2 = l o g 2 N (2.2) O2=log_2{N}\tag{2.2} O2=log2​N(2.2)

  3. 总的算法时间复杂度为:
    O ( l o g 2 N ) = O 1 + O 2 (2.3) O(log_2{N})=O_1+O_2\tag{2.3} O(log2​N)=O1​+O2​(2.3)

其实这里做判断的时候,应该看一下循环变量的递增方式,这里它是i=i*2 也就是 2^x=N,那么X=log2(N),x就是次数,在计算复杂度里面,一般省略底数,也就是直接写log(N),其他的计算方法与上面的解释一致。

例子3

for(int sum=0,i = 0;i<N;i++)        //1、for(int j = 1;j < N;j = j*2)     //2、sum=sum+i*j;                //3、

答案分析:

  1. 注释1的语句频度为:
    O 1 = 1 + N + 1 + N (3.1) O_1=1+N+1+N\tag{3.1} O1​=1+N+1+N(3.1)

  2. 注释2的语句频度为:
    O 2 = N + N ∗ ( l o g 2 N + 1 ) + N ∗ l o g 2 N (3.2) O_2=N+N*(log_2{N}+1)+N*log_2{N}\tag{3.2} O2​=N+N∗(log2​N+1)+N∗log2​N(3.2)

  3. 注释3的语句频度为:
    O 3 = N ∗ l o g 2 N (3.3) O_3=N*log_2{N}\tag{3.3} O3​=N∗log2​N(3.3)

  4. 总的算法时间复杂度为:
    O ( N ∗ l o g 2 N ) = O 1 + O 2 + O 3 O(N*log_2{N})=O_1+O_2+O_3 O(N∗log2​N)=O1​+O2​+O3​

如果你认真仔细地边看边思考,那么我相信你应该是能够理解如何去计算时间复杂度了,那么任何程序相信在你们自己的简单化下,应该都能分出它们的大致大O阶。
那么,关于算法的时间复杂度就描述到这里。谢谢你的浏览,如果你喜欢的话,记得点个赞。

欢迎前往我的个人博客,该文章已同步至我的个人博客: 遇见山人

这里告诉你如何计算算法的时间复杂度(大O阶)相关推荐

  1. 如何计算算法的时间复杂度

    原地址:http://www.nowamagic.net/librarys/veda/detail/2195 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变 ...

  2. 简单分析算法的时间复杂度

    目录 一.什么是算法的时间复杂度 二.如何分析一个算法的时间复杂度 1.有确定次数的算法 2.次数不确定的算法 一.什么是算法的时间复杂度         时间复杂度是一个函数 ,定性描述一个算法(程 ...

  3. 算法的时间复杂度详解

    算法的时间复杂度是衡量一个算法效率的基本方法.在阅读其他算法教程书的时候,对于算法的时间复杂度的讲解不免有些生涩,难以理解.进而无法在实际应用中很好的对算法进行衡量. <大话数据结构>一书 ...

  4. 算法的时间复杂度和空间复杂度评估

    通常,对于一个给定的算法,我们要做 两项分析.第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式.数学归纳法等.而在证明算法是正确的基础上,第二部就是分析算法的 ...

  5. 【数据结构与算法 10】算法的时间复杂度和空间复杂度

    最近在研究数据结构与算法,在B站中找到了小甲鱼的<数据结构与算法课程>,挺有意思的! 尚硅谷Java数据结构与java算法,韩顺平数据结构与算法 对于一个算法来说,分析有两步,第一是从数学 ...

  6. [算法基础]--时间复杂度和空间复杂度

    感谢原文作者:https://blog.csdn.net/zolalad/article/details/11848739 算法的时间复杂度和空间复杂度-总结 通常,对于一个给定的算法,我们要做 两项 ...

  7. 计算算法的时间复杂度和空间复杂度

    算法的时间复杂度和空间复杂度-总结 通常,对于一个给定的算法,我们要做 两项分析.第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式.数学归纳法等.而在证明算法 ...

  8. 算法的时间复杂度(python版容易理解)+常用的时间复杂度、python代码--数据结构

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.算法时间 ...

  9. 算法的时间复杂度[ZT]

    定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的"时间复杂性". 当输入量n逐渐加大时,时间复杂性的极限情形称为算 ...

最新文章

  1. mysql的条件替换_MySQLwhere条件替换疑问?
  2. Linux中link,unlink,close,fclose详解
  3. tensor判断是否相等_PyTorch的Tensor(中)
  4. Widget开发中遇到的坑
  5. 如何在微信公众号添加“历史文章”按钮
  6. PetShop 4.0知识点:加密和解密Web.config文件的配置节
  7. Linux fork与vfork的区别
  8. java9之后,String为何从char类型数组转成byte类型数组
  9. OpenCV下载/OpenCV国内镜像/opencv_contrib下载
  10. Mysql基础增删改查语句
  11. java integer最大值_Integer的最大值
  12. 计算机一级登录密码忘了怎么办,电脑密码忘了怎么办
  13. 「斐讯」N1-YYF 固件
  14. Node.js TLS/SSL
  15. 你以为你真的看懂《寒战》了吗?
  16. 什么是自尊心?自尊心对一个人有多重要?优缺点是什么?
  17. 计算机算法专业有哪些,计算机专业的研究生研究方向有哪些
  18. 开发者中心证书报错Program License Agreement updated解决方法
  19. JS踩坑标注:input控件的ONINPUT方法
  20. [第三场T5]Zoltan

热门文章

  1. 用迭代法求某数a的平方根
  2. 沪江日语小D落户博客园~
  3. Android Zxing 扫描器 扫描框、扫描线定制样式
  4. 【HTTP API】简单的http签名算法
  5. ValidationError: Invalid options object.报错
  6. 哈希表实现电话号码查询系统(c++)
  7. (平衡)kd树的创建与搜索
  8. 【学习笔记】语义分割综述
  9. EOS智能合约开发系列(七): 多索引table
  10. mybatis拦截器实现数据脱敏拦截器使用