一、时间频度:
一个算法花费的时间与算法中语句的执行次数成比例,哪个算法中语句执行的次数多,它花费时间就多。
一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
在计算时间频度时,常数项和低次项可以忽略,因为随着n变大,时间频度会无限接近。
例如:从1++++++100的结果5050,利用等差数列公式计算的会飞快
import time
#累计1至1亿的总和
start=1
end=100000000
#暴力运算
starttime = time.time()#开始
result=0
for x in range(start,end+1):
result+=x
endtime = time.time()#结束
print("暴力运算结果:{0},消耗时间:{1}".format(result,(endtime - starttime)))
#等差数列
starttime1 = time.time()#开始
result1=end*(end+1)//2
endtime1 = time.time()#结束
print("等差数列求和公式结果:{0},消耗时间:{1}".format(result1,(endtime1 - starttime1)))
分析:
循环从1-1亿一共1亿次,需要再判断一回才能退出。
算法2:result=(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)最坏情况下的时间复杂度是在算法在任何输入实例上运行的界限,就保证了算法的运行时间 不会比最坏情况更长
4、总结:
a)、通过时间复杂度我们就可以计算出我们的代码效率如何,在后期代码优化上起到证明的作用。
万丈高楼平地起,程序员数学基础,从小学的【什么是数学】至【离散数学】(主要是图论)咱们一步步成长,共同加油。