算法的时间复杂度

前言:

最近在复习基础算法,这里记录一下复习过程,以后有新体会随时更新。

学习算法,离不开对算法执行效率的评估,下面记录一下对算法复杂度的理解,以及算法时间复杂的计算。

1.算法的复杂度

1.1时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。

1.2空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。

设计算法时,一般是要先考虑系统环境,然后权衡时间复杂度和空间复杂度,选取一个平衡点。不过,时间复杂度要比空间复杂度更容易产生问题,因此算法研究的主要也是时间复杂度,不特别说明的情况下,复杂度就是指时间复杂度。

2.时间复杂度

2.1时间频度

一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。而一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度时间频度。记为T(n)

2.2时间复杂度

时间频度T(n)中,n称为问题的规模,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度

算法复杂度可以从最理想情况平均情况最坏情况三个角度来评估,由于平均情况大多和最坏情况持平,而且评估最坏情况也可以避免后顾之忧,因此一般情况下,我们设计算法时都要直接估算最坏情况的复杂度。 

 

通常,除非特别指定,我们提到的运行时间都是最坏情况的运行时间

对于追问为什么是最坏时间复杂度的好奇宝宝:

1、如果最差情况下的复杂度符合我们的要求,我们就可以保证所有的情况下都不会有问题。

2、也许你觉得平均情况下的复杂度更吸引你(见下),但是:

第一,难计算

第二,有很多算法的平均情况和最差情况的复杂度是一样的.

第三,而且输入数据的分布函数很可能是你没法知道。

常见的时间复杂度递进关系如下图:

 

 

3.大O表示法

像前面用O( )来体现算法时间复杂度的记法,我们称之为大O表示法。 
大O表示法O(f(n)中的f(n)的值可以为1、n、logn、n²等,因此我们可以将O(1)、O(n)、O(logn)、O(n²)分别可以称为常数阶、线性阶、对数阶和平方阶,那么如何推导出f(n)的值呢?我们接着来看推导大O阶的方法。

1. 找到执行次数最多的语句 
2. 计算语句执行次数的数量级
3. 用大O来表示结果 

用大O表示结果,遵循如下规则: (即T(n)->f(n)的规则)
1.用常数1来取代运行时间中所有加法常数。 
2.修改后的运行次数函数中,只保留最高阶项 
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。

以下面代码为例计算时间复杂度:

for(int i=0;i<n;i++){   
      for(int j=i;j<n;i++){
         //复杂度为O(1)的算法
         ... 
      }
  }

需要注意的是内循环中int j=i,而不是int j=0。当i=0时,内循环执行了n次;i=1时内循环执行了n-1次,当i=n-1时执行了1次,我们可以推算出总的执行次数为:

n+(n-1)+(n-2)+(n-3)+……+1 
=(n+1)+[(n-1)+2]+[(n-2)+3]+[(n-3)+4]+…… 
=(n+1)+(n+1)+(n+1)+(n+1)+…… 
=(n+1)n/2 
=n(n+1)/2 
=n²/2+n/2

根据此前讲过的推导大O阶的规则的第二条:只保留最高阶,因此保留n²/2。根据第三条去掉和这个项的常数,则去掉1/2,最终这段代码的时间复杂度为O(n²)。

 

参考博文:

https://blog.csdn.net/itachi85/article/details/54882603

https://blog.csdn.net/eirlys_north/article/details/52959540

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值