算法时间频度,时间复杂度和最坏时间复杂度和空间复杂度
算法的时间复杂度
度量一个程序(算法)执行的两种方法
1.事后统计的方法
这种方法可行,但有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序:二是所的时间的统计量依赖于计算机的硬件,软件的环境因素,这种方式,要在同一台计算机的相同状态下运行,才能比较那个算方快
2.事前估算的方法
通过分析某个算法的时间复杂度来判断那个算法更优异
时间频度
基本介绍:
时间频率:一个算法花费的时间与算法的语句的执行次数成正比,哪个算法中语句执行次数多,它花费时间就多,一个算法中的语句执行次数称为语句的频度或时间频度。记为T(n)。
随着n的变大可以忽略常数项,一次项,系数
时间复杂度
1.一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,若有某个辅助函数f(n)使得当n无穷大时,用T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间按复杂度,简称时间复杂度,
2.T(n)不同,但时间复杂度可能相同,如T(n)=n^2+7n+6与T(n)=3n^2+2n+2它们的T(n)不同,但时间复杂度相同都为O(n^2).
3.计算时间复杂度的方法:
用常数1代替运行时间中的所有加法常数T(n)=n^2+7n+6=>T(n)=n^2+7n+1
修改后的运行次数函数中,只有保留最高阶项T(n)=n^2=7n+1=>T(n)=n^2
去除最高阶项系数T(n)=n^2=>T(n)=>O(n^2)
说明;常见的算法时间复杂度由大到小依次为:O(1)<O(log2^n)<O(n)<O(nlog2^n)<O(n^2)<O(n^3)<O(n^k)<O(2^n),随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率低,从图可知,我们应该尽可能避免使用指数阶的算法
常见的时间复杂度
1.常数阶O(1)
无论代码执行了多少行,只要是没有循环的结构等复杂度结构,那这个代码的时间复杂度就都是O(1),他的消耗并不是某个变量的增长而增长。
2.对数阶O(log2^n)
说明;在循环里面,每次都将i乘2,乘完后,i距离n就越近,循环x次,i就大于2,
3.线性阶O(n)
for循环里面的代码会执行n遍,因此他的消耗的时间是随着n的变化而变化,因此这段代码都可以用O(n)来表示他的时间复杂度
4.线性对数阶;O(nlogN)
线性对数阶是将时间复杂度O(logn)的代码循环N遍的话,那么它时间复杂度就是n*O(logN)就是O(nlogN)
平方阶O(n^2)
把O(n)的代码在循环一遍,这段代码其实就是嵌套了2层n循环
如果将n改成m就是O(m*n)
立方阶O(n^3),k方阶O(n^k)
参考O(n^2)去理解好了
平均时间复杂度和最坏时间复杂度
1.平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间
2.最坏情况的时间复杂度称最坏时间复杂度。一般讨论的时间复杂度均是最坏时间复杂度,它是算法在任何输入实例上运行时间的界限,这保证算法的时间不会比最坏的时间长
3.平均时间复杂度和最坏时间复杂度是否一致,和算法有关
空间复杂度
基本介绍
1.类似于时间复杂度的讨论,一个算法的空间复杂度定义为该算法所消耗的储存空间,他也是问题规模n的函数
2.空间复杂度是对一个算法在运行过程中临时占用储存空间大小的量度。有的算法占用临时单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的储存单元,例如快速排序和归并排序
3.算法分析更看重时间复杂度,一些缓存产品和算法本质就是用空间换时间
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报