算法的时间复杂度计算方法

  《大话数据结构》中对算法的时间复杂度定义如下:

  “算法分析时,语句的总执行次数T[n]是关于问题规模n的函数,进而分析T[n]随n的变化情况并确定T[n]的数量级。算法的时间复杂度,也就是算法的时间度量,记做T[n]=O(f[n]),表示随问题规模n的增大,算法的执行时间的增长率和f[n]的增长率相同,称做算法的渐进时间复杂度,简称时间复杂度,f[n]是问题规模n的某个函数。”

  根据定义举个例子,计算1+2+3+4+···+100 = ?

  int sum = 0 ,n=100;

  for(int i=1;i<=n;i++){

    sum+=i;

  }

  算法执行完毕时,语句的总执行次数T[n] = 1+n+1+n = 2n+2,随着问题规模n的增大,算法的执行时间的增长率和f[n]的增长率相同,其中f[n] = 2n,因为随着n的增大,常数2并不增大,为了简化计算,取主要的执行次数2n,这样的话T[n] = O(2n)。 也就是O(n) 【下文解释为什么去掉2】

  同一个问题,我们使用高斯的算法解决。

  int sum = 0,n = 100;

  sum = (n*(n+1))/2;

  算法执行完毕时,语句总执行次数为2,T[n]=O(2)。也就是O(1)【下文解释】

  通过以上例子,给出“大O阶”的推倒(?*?ω?)? 步骤:

  1.计算语句总执行次数得出f[n]

  2.用常数1取代运行此书中的所有加法常数

  3.在修改后的运行次数函数中,只保留最高阶项

  4.如果最高阶项存在且不是1,去除于这个项相乘的常数

  再举个例子

  int n=100;

  for(int i=0; i<n; i++){

    for(int j=0; j<n; j++){

      n--;

    }

  }

  printf("n=%d",n);

  第一句很明显执行1次,嵌套循环的执行次数一眼看不出来,这就需要分析了,先看内循环,j自增一次,n自减一次,可以推测当n自减到n/2时,第一次内循环结束,此时第二句执行了一次。接下来看第二次内循环,当n减到n/4的时候,第二次内循环结束,第二句执行了第二次。由此可知,当i>=n/(2i)时,外循环也就是第二句结束,也就是说外循环最多运行n/(2i)次,当n等于一百万的时候,i等于16,所以外循环可以忽略不计,内循环 n--; 执行了n-n/(2i)次,约等于n次。所以这个例子的算法时间复杂度为O(n)。

  上面那个例子是我自己编的。最开始计算外层循环的时候也迷糊了,在群里和大家讨论了才明白,这也告诉我们,计算复杂度的时候,一定要有全局观,不要死磕每一句的执行次数。今早在看《编程珠玑》时,了解了近似估算,发现也可以用在这个地方。

  最后给出各种复杂度的图像,绘图工具使用的是Mathematica,感觉是比Matlab更好用的数学工具。

  

  删除几个增长率快的

  

时间: 2024-11-08 23:04:10

算法的时间复杂度计算方法的相关文章

数据结构和算法之时间复杂度和空间复杂度

前言 上一篇<数据结构和算法>中我介绍了数据结构的基本概念,也介绍了数据结构一般可以分为逻辑结构和物理结构.逻辑结构分为集合结构.线性结构.树形结构和图形结构.物理结构分为顺序存储结构和链式存储结构.并且也介绍了这些结构的特点.然后,又介绍了算法的概念和算法的5个基本特性,分别是输入.输出.有穷性.确定性和可行性.最后说阐述了一个好的算法需要遵守正确性.可读性.健壮性.时间效率高和存储量低.其实,实现效率和存储量就是时间复杂度和空间复杂度.本篇我们就围绕这两个"复杂度"展开

[算法技术]算法的时间复杂度与空间复杂度

1.时间复杂度 算法的时间复杂度是衡量一个算法效率的基本方法.在阅读其他算法教程书的时候,对于算法的时间复杂度的讲解不免有些生涩,难以理解.进而无法在实际应用中很好的对算法进行衡量.            <大话数据结构>一书在一开始也针对算法的时间复杂度进行了说明.这里的讲解就非常明确,言简意赅,很容易理解.下面通过<大话数据结构>阅读笔记的方式,通过原因该书的一些简单的例子和说明来解释一下算法的时间复杂度和它的计算方法.          首先从基本定义下手,来了解一下什么是“

算法的时间复杂度计算

参考自:此文 一.循环执行次数的计算 1.双重循环 for(int i=1;i<=n;i++) // 外层n次 for(int j=1;j<=i;j++) // 内层i次 f(); 总次数=1+2+3+..+n=(1+n)*n/2 时间复杂度=O(n^2) 2.三重循环 for(int i=1;i<=n;i++) // 外层n次 for(int j=1;j<=i;j++) // 内层为双重循环,执行次数为(1+i)*i/2=i^2/2+i/2 for(int k=1;k<=j

【数据结构与算法】时间复杂度的计算

算法时间复杂度的计算 [整理] 博客分类: 算法学习 时间复杂度算法 基本的计算步骤  时间复杂度的定义     一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数.记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度. 根据定义,可以归纳出基本的计算步骤 1. 计算出基本操作的执行次

常用排序算法之--时间复杂度计算

本篇博文非博主原创,系通过度娘收集整理而来,如有雷同,请联系博主,追加上转载出处.同时博主水平和理解有限,如有什么偏差请广大博友指定. 学习交流qq:792911374 时间复杂度 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.一个算法的时间开销记作:T(n),其中n表示算法的基本操作模块被重复执行的次数.算法的时间复杂度记做T(n)=O(f(n)),随着n的增大,算法执行时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高.时

前端 算法的时间复杂度和空间复杂度

算法的评估 对于一个问题,经常有多种不同的求解算法,这时候我们就需要一个对算法进行评估的标准,找出最优的方案,评估一个算法有以下几个维度: 正确性:能正确的实现功能,满足问题的需求. 易读性:通常,写出一个利与人类阅读的代码和利于机器阅读的代码一样重要 健壮性:对于预料之外的输入,也能做出合适的处理. 时空性:算法的时间性能(算法的计算量)和空间性能(算法需要的存储量). 时间复杂度 时间复杂度的计算方法 时间复杂度:在给定输入(问题规模)下,算法的计算量. 所以说,求一个算法的时间复杂度,就是

算法的时间复杂度和空间复杂度

<算法的时间复杂度和空间复杂度合称为算法的复杂度> --->算法的时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了.并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多.一个算法中的语句执行次数称为语句频度或时间频度.记为T(n). (2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模

php算法基础----时间复杂度和空间复杂度

算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度). 简单来说,时间复杂度指的是语句执行次数,空间复杂度指的是算法所占的存储空间 时间复杂度 计算时间复杂度的方法: 用常数1代替运行时间中的所有加法常数 修改后的运行次数函数中,只保留最高阶项 去除最高阶项的系数 按数量

第5课 算法的时间复杂度

1. 定性判断算法的效率 (1)时间复杂度:算法运行后对时间需求量的定性描述(数据结构课程集中讨论的内容) (2)空间复杂度:算法运行后对空间需求量的定性描述(判断方法类似于时间复杂度) 2. 大O表示法 (1)算法效率严重依赖于操作(Operation)数量 (2)操作数量的估算可以作为时间复杂度的估算 (3)在判断时首先关注操作数量的最高次项 O(5) =O(1) O(2n+1)=O(2n)=O(n) O(n2+n+1) = O(n2) O(3n3+1)=O(3n3)=O(n3) 3. 常见