什么是时间复杂度?

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

时间复杂度

        时间复杂度是算法执行时间随输入规模增长而增长的量度,通常用大 O 记号表示。它反映了算法在解决问题时所耗费的时间资源,也可以理解为算法的运行效率。时间复杂度分析的目的是确定算法执行时间与输入规模之间的关系,并帮助我们选择更高效的算法来解决问题。

        提到时间复杂度,第一时间想到的是算法,简单说,算法就是你解决问题的方法,而你用这个方法解决这个问题所执行的语句次数,称为语句频度或者时间频度,记为T(n)。

        那么问题来了,我们为什么要引入这些个概念呢。因为我们想要的是执行一个算法耗费的时间,这个时间理论上可以得到,但是,要得到这个时间就必须要上机测试,但是有这个必要吗?我们需要知道的是哪一个算法需要的时间多,哪一个算法需要的时间少,这样就可以了。而且,算法的耗时和语句的执行次数是成正比的,即语句执行越多,耗时越多。这也就是我们引入概念的原因。

        在上面提到的时间频度T(n)中,n是指算法的规模,n不断的变化,T(n)就会不断的变化,而这些变化的规律是怎样的呢?于是我们引入了时间复杂度的概念。

        什么是时间复杂度,算法中某个函数有n次基本操作重复执行,用T(n)表示,现在有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。通俗一点讲,其实所谓的时间复杂度,就是找了一个同样曲线类型的函数f(n)来表示这个算法的在n不断变大时的趋势 。当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。         

        我们用大O表示法表示时间复杂性,它是一个算法的时间复杂性。大O表示只是说有上界但并不是上确界。

        “大O记法”:在这种描述中使用的基本参数是 n,即问题实例的规模,把复杂性或运行时间表达为n的函数。这里的“O”表示量级 (order),比如说“二分检索是 O(logn)的”,也就是说它需要“通过logn量级的步骤去检索一个规模为n的数组”记法 O ( f(n) )表示当 n增大时,运行时间至多将以正比于 f(n)的速度增长。 

        时间复杂度对于算法进行的分析和大致的比较非常有用,但是真正的情况可能会因为一些其他因素造成差异。比如一个低附加代价的O(n2)算法在n较小的情况下可能比一个高附加代价的 O(nlogn)算法运行得更快。但是,n越来越大以后,相比较而言较慢上升函数的算法会运行的更快。

时间复杂度是渐进的      

        常见的时间复杂度有:O(1)、O(log n)、O(n)、O(n log n)、O(n²) 等。其中,O(1) 表示算法的执行时间不随输入规模增长而增长;O(log n) 表示算法的执行时间随输入规模增长而增长,但增长速度非常缓慢;O(n) 表示算法的执行时间与输入规模成线性增长关系;O(n log n) 表示算法的执行时间随输入规模增长而增长,并且增长速度介于线性和平方之间;O(n²) 表示算法的执行时间随输入规模增长而呈现平方级别的增长。 

        在实际的算法设计和分析中,我们通常关注最坏情况下的时间复杂度,即算法在处理最难的输入时所需的时间。

        如果我们将算法中的一次计算记为 1,那么如果有 n 个输入值,算法对每一个输入值做一次运算,那么整个算法的运算量即为 n。这个时候,我们就可以说,这是一个时间复杂度为 O(n) 的算法。

        同理,如果仍有 n个输入值,但算法对每一个输入值做一次运算这个操作需要再重复n次,那么整个算法的运算量即为n*n = n^2,时间复杂度为 O(n^2) 。

        这时如果对每一个输入值做一次运算,而这个操作需要重复n+1次,算法运算量变为:

                n(n+1) = n^2 + n。

        这时的时间复杂度是否改变为O(n^2+n)呢?

        上文曾提到时间复杂度考察的是当输入量趋于无穷时的情况,所以当 n趋于无穷的时候,n^2 对算法运行时间占主导地位,而 n 在 n^2 面前就无足轻重,不计入时间复杂度中。

        换句话说,因为n^2 + n渐近地(在取极限时)与 n^2相等。此外,就运行时间来说,n 前面的常数因子远没有输入规模 n的依赖性重要,所以是可以被忽略的,也就是说O(n^2)和 是O(n^2/2)相同时间复杂度的,都为O(n^2)。

简单算法的时间复杂度举例 

        O(1)的算法是一些运算次数为常数的算法。例如:

            temp=a;a=b;b=temp;

        上面语句共三条操作,单条操作的频度为1,即使他有成千上万条操作,也只是个较大常数,这一类的时间复杂度为O(1)。


        O(n)的算法是一些线性算法。例如:

            sum=0;                 

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

            sum++;

        上面代码中第一行频度1,第二行频度为n,第三行频度为n,所以f(n)=n+n+1=2n+1。所以时间复杂度O(n)。这一类算法中操作次数和n正比线性增长。


        O(logn) 一个算法如果能在每个步骤去掉一半数据元素,如二分检索,通常它就取 O(logn)时间。举个栗子:

            int i=1; 

            while (i<=n) 

            i=i*2; 

        上面代码设第三行的频度是f(n),   则:2的f(n)次方<=n;f(n)<=log₂n,取最大值f(n)= log₂n,所以T(n)=O(log₂n ) 。


        O(n²)(n的k次方的情况)最常见的就是平时的对数组进行排序的各种简单算法都是O(n²),例如直接插入排序的算法。

        而像矩阵相乘算法运算则是O(n³)。

        举个简单栗子:

            sum=0;                

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

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

            sum++;

        第一行频度1,第二行n,第三行n²,第四行n²,T(n)=2n²+n+1 =O(n²)


        O(2的n次方) 比如求具有n个元素集合的所有子集的算法 


        O(n!) 比如求具有N个元素的全排列的算法


        时间复杂度按n越大算法越复杂来排的话:常数阶O(1)、对数阶O(logn)、线性阶O(n)、线性对数阶O(nlogn)、平方阶O(n²)、立方阶O(n³)、……k次方阶O(n的k次方)、指数阶O(2的n次方)。

借用别人的图:

总结

        时间复杂度是一个衡量算法运行效率的概念,表示随着问题规模n的增加,算法所需的执行时间的增速。一般用大O符号来表示,称为“大O记号”,如O(1)、O(log n)、O(n)、O(n log n)等。

        不同的算法在处理同一问题时,其时间复杂度可以有明显的差异,因此选择高效的算法对于解决大规模数据问题时尤为重要。

        时间复杂度的目的是为了帮助我们在实际开发中,选择更优秀的算法来解决具有不同规模的问题。因为对于大规模的问题,其时间复杂度的差异会直接影响到算法的实际执行效率。因此,我们需要在算法设计时考虑时间复杂度,选择最优的算法来处理实际的问题。

        需要注意的是,时间复杂度并非表示具体的执行时间,而是代表了算法执行时间和输入规模之间的关系,因此只能用于算法之间的比较,不能直接用于预测算法的实际执行时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253198.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

AI Canon精选资源清单;带AI功能的PS安装文件与教程;讯飞星火10月对标 ChatGPT;直播换脸工具盘点 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; AI Canon&#xff1a;人工智能精选资源清单 思维导图 ShowMeAI知识星球资源编码&#xff1a;R106 AI Canon 是由美国著名的风投机构 …

网络攻防技术--论文阅读--《基于自动数据分割和注意力LSTM-CNN的准周期时间序列异常检测》

英文题目&#xff1a;Anomaly Detection in Quasi-Periodic Time Series based on Automatic Data Segmentation and Attentional LSTM-CNN 论文地址&#xff1a;Anomaly Detection in Quasi-Periodic Time Series Based on Automatic Data Segmentation and Attentional LST…

Mybatis学习(狂神)

文章目录 前言1、 Mybatis简介1.1、什么是MyBatis1.2 、持久化1.3、持久层1.4、为什么需要Mybatis 2、MyBatis第一个程序2.1、源码演示2.2、可能遇到的问题 3、CRUD操作3.1、namespace3.2、select3.3、insert3.4、update3.5、delete3.6、使用Map3.7、模糊查询 4、配置解析4.1、…

近期很火的PHOTOSHOP特效教程集合

身为设计师&#xff0c;应该经常给自己充充电(最近一直在忙一下家里的事情&#xff0c;首先得忏悔一下~哈哈哈~~) 比如临摹一些优秀作品或学习最新流行的Photoshop教程&#xff0c;这样的话你可以从中获得一些新的设计技巧及提高自身的设计能力。 今天为了弥补这几天荒废的时间…

高级特效-PS多边形特效/Photoshop特效/动态人像速成 [精品推荐]

课程目标 学习本课程&#xff0c;你可以学会简单的屏幕录制&#xff0c;也可以快速的制作出流行的PS多边形特效&#xff0c;不再需要用PS软件一个一个的绘制多边形&#xff0c;就能制作出各种酷炫且超有质感的画面。随便拿出一个素材&#xff0c;就能瞬间生成PS多边形特效。 适…

ps入门教程高阶教程各工作领域视频教程合集

PS在工作中的运用非常之广泛&#xff0c;在这里推荐一些系统的PS教程大家&#xff0c;从初级到进阶教程&#xff0c;涉及不同的职业或者岗位&#xff0c;学习起来更方便和系统。      ps高清视频教程入门到精通&#xff1a;zhpsjc.top      PS教程及其在行业中的运用  …

PS|如何制作出‘粒子消失特效’的效果呢

欢迎点击「算法与编程之美」↑关注我们&#xff01; 本文首发于微信公众号&#xff1a;"算法与编程之美"&#xff0c;欢迎关注&#xff0c;及时了解更多此系列文章。 欢迎加入团队圈子&#xff0c;与作者面对面&#xff0c;直接点击&#xff01; 说起灭霸的‘响指’&…

【有利可图网】PS教程:用PS合成立体特效的穿插照片效果

把人物和背景融为一体&#xff0c;使人物从照片中穿出来&#xff0c;这种想法是不是很神奇&#xff0c;这种操作在我们的PS软件里就可以实现&#xff0c;人物与背景的穿插效果&#xff0c;相信很多同学们都喜欢&#xff0c;具体如何制作&#xff0c;相信同学们很好奇&#xff0…

ps教程分享:一定要记住这20种PS技术!

一定要记住这20种PS技术&#xff01;会让你的照片美的不行&#xff01; 一种简单的数码照片后期润饰 1&#xff09;打开图片,执行色像/饱和度&#xff08;-40&#xff09;降低饱和度。 2&#xff09;新建一图层&#xff0c;将图层模式改为柔光&#xff0c;用画笔工具将需要润…

保姆级PS教程:建筑表现后期中的照明处理

作者&#xff1a;OUgraphics 今天与大家分享OUgraphics出品的 建筑表现后期的照明表现PS教程 在视频中&#xff0c;作者将通过一个案例的处理 为大家演示如何在Photoshop中创建光效 过程中有很多非常实用的技巧 正如作者所说&#xff0c;它彻底改变你处理夜景和照明的方式 …

html css ps切图教程,Photoshop(PS)CSS切图必用工具

Adobe PHOTOSHOP日常咱们又被称为PS。 div CSS必备切图工具PS截图 多数人对于PHOTOSHOP的了解仅限于“一个很好的图象编辑软件”&#xff0c;并不晓得它的诸多使用方面&#xff0c;理论上&#xff0c;PHOTOSHOP的运用规模很广泛的&#xff0c;在图像、图形、笔墨、视频、出版各…

PS特效动作制作合成创意报纸人物效果

动作支持CS3以上版本软件&#xff0c;首先到陌鱼社区下载“制作创意报纸印刷故障人像效果PS动作”&#xff0c;然后我们用这个动作就可以制作出下图效果哦。 01、打开软件&#xff0c;载入图案(.pat)、动作(.atn)&#xff0c;关闭软件。 02、接下来就是把软件切换成英文&#x…

珍藏的老照片损坏如何修复?今天分享PS老照片修复教程别错过!

原图素材虽然很旧&#xff0c;不过人物部分并没有怎么损坏&#xff0c;只是有一些色块和杂色。修复的工程相对来说也少很多。只需要给人物磨好皮&#xff0c;然后把暗调和高光部分调出来即可。原图 一、打开原图素材&#xff0c;按Ctrl J 把背景图层复制一层&#xff0c;图层混…

PS动作制作3D分散抽离人物粉尘特效

本次所使用动作支持CS5以上版本软件,还是我们需要到陌鱼社区下载“制作粉尘抽离3D立体特效人物PS动作”最后用这个动作一键制作出下图效果。 01、打开软件&#xff0c;载入画笔、动作&#xff0c;关闭软件。 02、把软件变成英文&#xff0c;看这个“怎么把PS界面语言变成英文方…

html css ps切图教程,CSS切图学习之认识PHOTOSHOP(PS)

CSS切图软件之ps截图 Adobe PHOTOSHOP平时咱们又被喻为PS。 少数人关于PHOTOSHOP的了解仅限于“一个很好的图象编纂软件”&#xff0c;其实不晓得它的诸多应用方面&#xff0c;实践上&#xff0c;PHOTOSHOP的运用领域很广泛的&#xff0c;在图象、图形、翰墨、视频、出书各方面…

炫酷木炭裂缝燃烧钢丝人物特效PS动作

依然需要用到一组“制作钢丝缠绕人物木炭燃烧效果PS动作”然后载入相关预设即可做出这样的效果&#xff0c;动作支持CS4以上版本PS软件&#xff0c;下面请看演示。 01、载入画笔、图案、渐变、动作&#xff0c;关闭软件。 02、把软件转换成英文&#xff0c;不懂转换的可以参考这…

PS制作人物消失特效烟雾GIF动画

首先我们需要到陌鱼社区下载制作人像烟雾炫光GIF动画效果PS动作&#xff0c;然后就可以继续我们下面的教程了&#xff0c;下面是这个动作制作出来的一些效果。 01、载入画笔、动作然后关闭软件&#xff0c;怎么载入可参考下图。 02、把软件切换成英文&#xff0c;在软件安装目录…

计算机ps特效教程,计算机一级photoshop给照片制作半素描效果教程

计算机一级photoshop给照片制作半素描效果教程 引导语&#xff1a;素描是一种用绘图工具使其表现在二维材质上的视觉艺术。那么如何用ps做出素描效果呢&#xff0c;以下是百分网小编分享给大家的计算机一级photoshop给照片制作半素描效果教程&#xff0c;欢迎参考学习! 1、启动…

chatgpt赋能python:Python中未定义变量的默认值

Python中未定义变量的默认值 在Python编程中&#xff0c;有时候我们会使用未经定义的变量。如果这些变量没有被定义&#xff0c;那么它们将没有任何值。在这篇文章中&#xff0c;我们将讨论Python中未定义变量默认值的问题&#xff0c;并深入研究为什么这些默认值如此重要。 …

C语言system()函数

文章目录 C语言system()函数system(“pause”)system(“color num1num2”)system(“cls”)system(“title name”)system(“time /T”) & system(“date /T”) C语言system()函数 头文件&#xff1a; #include<stdlib.h>system(“pause”) 作用&#xff1a;暂停程序进…