算法的时间复杂度

一、时间频度

1.基本介绍:

  时间频度:一个算法花费的时间与算法中语句的执行次数成比例,哪个算法中语句执行的次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。在计算时间频度时,常数项和低次项可以忽略,因为随着n变大,时间频度会无限接近。

举例说明:计算1-100所有数字之和,我们设计两种算法。

算法1:

int total=0;
int end=100;
for(int i=1;i<=100;i++) {
total+=i;
}

n=100
T(n)=n+1=101

分析:循环从1-100一共100次,需要再判断一回才能退出。

算法2:total=(1+end)*end/2(这个是等差数列求和公式:(a1+an)*n/2)一步到位 T(n)=1

二、时间复杂度

1.时间复杂度:

1)一般情况下,算法中的基本操作语句的重复执行次数是时间规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋于无穷大时,T(n)/f(n)的极限值是一个不等于0的常数,则称f(n)是T(n)的同量级函数,记做T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。

2)T(n)不同,但时间复杂度可能相同,如T(n)=n2+7n+6与T(n)=3n2+2n+2,他们的T(n)不同,但时间复杂度相同,都为O(f(n))。

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

√ 常用常数1代替运行时间中的加法常数 如 T(n)=n2+7n+6==> T(n)=n2+7n+1

√ 修改后的运行次数函数中,只保留最高阶项  T(n)=n2+7n+1==> T(n)=n2

√ 去除最高阶项的系数  T(n)=n2==> T(n)=n2==>O(n2)

2.常见的时间复杂度:

1)无循环条件下常数阶 O(1)    最稳定

2)对数阶 如O(log2n)

3)线性阶 O(n)

4)线性对数阶 O(nlog2n) —线性阶*对数阶

5)平方阶 O(n2)    线性阶*线性阶   两层n循环

6)立方阶 O(n3)   三层n循环

7)k次方阶 O(nk)

8)指数阶 O(2n)    执行慢(指数爆炸)

说明:

○常见的时间算法时间复杂度从(1)到(8)越来越复杂,随着n的增大,时间复杂度不断增大,算法的执行效率越来越低(O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2) <O(n3) <O(nk)<O(2n)<O(n)!<O(nn))—简单记法:长对幂指阶

○我们应该尽可能避免(8)指数阶的算法

3.时间复杂度的规则

1)加法规则  T(n)=T1(n)+T2(n)=O(f(n)+O(g(n)=O(max(O(f(n),O(g(n))  多项式相加,只保留最高的阶,且系数变为1

2)乘法规则  T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n))  多项相乘,都保留

三、平均时间复杂度与最坏时间复杂度

1)平均时间复杂度是指所有有可能的输入实例均以等概率出现的情况下,该算法的运行时间

2)最坏情况下的时间复杂度是在算法在任何输入实例上运行的界限,就保证了算法的运行时间 不会比最坏情况更长

posted @ 2020-07-30 23:14  SpringChuXin  阅读(1059)  评论(0编辑  收藏  举报