时间频度

一个算法花费的时间与算法中语句执行次数成正比,哪个算法中语句执行次数多,它花费的时间就多。一个算法中语句的执行次数称为语句频度或时间频度。即为T(n).

//比如计算1到100所有数字之和,我们设计俩种算法:int count = 0;int end = 100;​//该算法中使用了for循环,循环了100+1(最后一次判断), 时间频度为T(100)=100+1, 即T(n)=n+1for(int i=1; i<=end; i++){    count+=i;}​//而如果我们使用公式来计算,只需执行一次即可得到结果,时间频度为T(100)=1, 即T(n)=1count = (1+end)*end/2

时间复杂度

在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。

大O符号

大O符号(Big O notation)是用于描述函数渐进行为的数学符号。更确切地说,它是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。在数学中,它一般用来刻画被截断的无穷级数尤其是渐近级数的剩余项;在计算机科学中,它在分析算法复杂性的方面非常有用。

常数项可忽略

如下图, 2n+20和2n 、 3n+10和3n ,随着n值的增大,执行曲线无限接近,这时我们基本可忽略掉常数项:20、10

低次项可忽略

如下图,2n^2+3n+10和2n^2、n^2+5n+20和n^2,随着n值的增大,执行曲线无限接近,这时我们基本可以忽略掉低次项和常数项:3n+10、5n+20

系数可忽略

如下图, 3n^2+2n和5n^2+7n 随着n值的增大,执行曲线无限接近,这时我们基本可以忽略掉低次项:2n、5n,和系数:3、5

但是要注意的是,如果n的指数大于2时,它们的系数会对结果影响较大,如下图的 n^3+5n和6^3+4n,这种情况则不可以忽略系数

所以我们可以把时间频度T(n)=2n^2+3n+10忽略掉常数、低次项和系数,记成时间复杂度O(n^2)

常见的时间复杂度

  • 常数阶O(1)
//无论代码执行了多少行,参数有多大,只要执行次数没有随着输入参数的变化而变化,那它的时间复杂度就是 O(1)int i = 1;int j = 2;++i;j++;int m = i+j;
  • 对数阶O(log2n)
//在while循环中,每循环一次i都会乘于2,当乘到x次时,i>n则退出循环,,所以while内的代码会执行x次,即i^x>n,又因为i每次的乘数是2即底数为2,所以它的时间复杂度是 (log2n), 如果乘数是3则是O(log3n)int i = 1;while(i
  • 线性阶O(n)
//在for循环中,j=i会被执行n次,所以它的时间复杂度为O(n)int j = 0;for(int i=1; i<=n; i++){    j = i;}
  • 线性对数阶O(nlog2n)
//线性对数对数阶则是将对数阶的代码再循环执行n遍,如果i的乘数为2,则时间复杂度为O(nlog2n)for(int m=1; m<=n; m++){    int i = 1;    while(i
  • 平方阶O(n^2)
//平方阶则是将线性阶再循环执行n遍,记总共执行了n*n=n^2,所以它的时间复杂度为O(n^2)int num = 0;for(int i=1; i<=n; i++){    for(int j=1; j<=n; j++){        num = i+j;    }}
  • 立方阶O(n^3)
  • k次方阶O(n^k)
//立方阶和k次方阶参考平方阶,原理是一样的
  • 指数阶O(2^n)
//因为时间复杂度为0(2^n)的算法开销过大,不推荐使用时间复杂度为0(2^n)的算法

平均时间复杂度和最坏时间复杂度

  1. 平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间。
  2. 最坏情况下的时间复杂度称最坏时间复杂度。一般讨论的时间复杂度均是最坏情况下的时间复杂度。 这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的界限,这就保证了算法的运行时间不会比最坏情况更长。
  3. 平均时间复杂度和最坏时间复杂度是否一致,核算 法有关(如图,以排序算法为例)。

空间复杂度

  1. 类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)定义为该算法所耗费的存储空间,它也是问题规模n的函数。
  2. 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法就属于这种情况
  3. 在做算法分析时,主要讨论的是时间复杂度。从用户使用体验上看,更看重的程序执行的速度。一些缓存产品(redis, memcache)和算法(基数排序)本质就是用空间换时间.

一层循环时间复杂度_数据结构与算法:算法的时间复杂度相关推荐

  1. 一层循环时间复杂度_数据结构与算法系列——时间、空间复杂度

    数据结构和算法本质就是帮我们用最快的时间和最少的空间来执行我们的代码.所以,执行效率是衡量一个算法的非常重要的指标.那如何来计算你的算法代码的执行效率呢?这就需要时间.空间复杂度来分析了. 有人可能会 ...

  2. a*算法的时间复杂度_数据结构与算法系列——时间、空间复杂度

    数据结构和算法本质就是帮我们用最快的时间和最少的空间来执行我们的代码.所以,执行效率是衡量一个算法的非常重要的指标.那如何来计算你的算法代码的执行效率呢?这就需要时间.空间复杂度来分析了. 有人可能会 ...

  3. a*算法的时间复杂度_数据结构(1)——算法和时间复杂度

    Data Structure 1 算法和时间复杂度 01.什么是数据结构? 程序设计 = 数据结构 + 算法 数据结构是关系,是数据元素相互之间存在的一种或多种特定关系的集合. 数据结构和算法凌驾于任 ...

  4. if嵌套while循环语句_选考VB算法专题系列讲座13嵌套If和多分支语句

    视频内容: 本视频是给学生复习If语句时的授课内容,长长的寒假过后,很多学生连最基本的东西的忘记了,只好从最简单的开始复习.本视频讲解了使用嵌套If和多分支语句解决的两个问题,讲解非常详细,基础不够扎 ...

  5. b+树时间复杂度_数据结构:线性表,栈,队列,数组,字符串,树和二叉树,哈希表...

    作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...

  6. 一层循环时间复杂度_数据结构:二叉排序树的前/中/后序遍历(递归与循环两种版本)...

    树的设计初衷与操作时间复杂度 树这种数据结构的出现主要是对链表数据结构的优化,链表数据结构是线性结构,操作一般需要O(N)的时间复杂度,树是链表的变形,即链表的每个节点包含一个节点,而树的节点可以包含 ...

  7. JAVA堆排序有监视哨吗_数据结构-各类排序算法总结

    各类排序算法总结 一. 排序的基本概念 排序(Sorting)是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个项值有序的序列. 有 n 个记录的序列{R1 ...

  8. java的 交换排序 快速排序算法_数据结构之排序算法Java实现(4)—— 交换类排序之快速排序算法...

    快速排序算法属于"交换类"的排序,它的效率主要跟数据分布是否对称有关. 升序排序: /** * 快速排序 * 升序排序 */ @Override public > void ...

  9. java 线性的排序算法_数据结构之排序算法Java实现(9)—— 线性排序之 基数排序算法...

    基数排序算法是计数排序的延伸,计数排序会造成很大的空间浪费,但基数排序法是对位数进行排序,适合于位数之间相差较大的情况,废话不多说,直接上代码: 升序排序法: /** * 基数排序法 * 升序排列 * ...

  10. 分支限界法时间复杂度_数据结构时间复杂度的摊还分析(均摊法)之一:基础...

    摊还分析用来评价某个数据结构的一系列操作的平均代价,有时可能某个操作的代价特别高,但总体上来看也并非那么糟糕,可以形象的理解为把高代价的操作"分摊"到其他操作上去了,要求的就是均摊 ...

最新文章

  1. 计算机网站编辑需要学什么,网站编辑工作的心得体会
  2. 函数式思维: 利用 Either 和 Option 进行函数式错误处理 类型安全的函数式异常...
  3. 边缘计算:安全保护 快速响应
  4. python基本使用-Python 应该怎么去练习和使用?
  5. 线上集群服务器性能参数查看命令
  6. scala基础语法:for/while/do...while/
  7. HDFS二次开发常见问题
  8. 《剑指offer》第三十一题(栈的压入、弹出序列)
  9. mac mysql创建本地数据库_【mac】配置本地数据库
  10. Docker系列之二:基于容器的自动构建
  11. C#窗体间的数据传值(转)
  12. Java学习作业(14.4.21)
  13. tomcat8打开闪退_直接双击启动tomcat中的startup.bat闪退原因及解决方法
  14. 2019年中国大学生计算机设计大赛--心得总结
  15. python算法精解pdf_算法详解(卷1)算法基础 PDF 完整高清版
  16. 最好的磁盘管理工具Acronis Disk Director Suite 10.0英文原版 + 注册机 + 使用图文介绍
  17. windows设置开机自动启动程序
  18. STM32——WAVWM8978简介
  19. 怎么在服务器上搭建网站(搭建服务器需要什么)
  20. 【资源管理器老是重启 win7资源管理器重启的解决办法】

热门文章

  1. Java并发容器,底层原理深入分析
  2. 【转载】教你使用 Reflexil 反编译.NET
  3. java指定一个具体日期
  4. mybatis逆向工程生成java代码和xml配置
  5. java.io.Serializab接口
  6. The word 'localhost' is not correctly spelled 这个问题怎么解决
  7. idea 版本控制 忽略要提交的文件
  8. VMware与Hyper-V不兼容
  9. linux学习小记 (一 )
  10. ping and traceroute(tracert)