第一章——算法的时间复杂度
1.知道什么是时间复杂度
如何看算法的好坏,我们需要评价运行过程中所占用的计算资源
计算资源包括时间和空间,我们现在主要考虑占用时间资源
时间资源简单说就是计算机处理的时间
计算机处理包括两大类(计算和储存)
这里我们先把程序设计语言中的语句分类一下
定义语句:(例如C语言中的 int a)不占用时间复杂度
控制流语句:顺序,条件分支,循环迭代,只是起到一个组织语句的作用,并不进行处理
赋值语句:求一个表达式的值,然后赋值给一个变量。是一个对算法进行很好度量的指标
所以求算法的时间复杂度就是看计算机关于计算和存储的语句(赋值语句)有多少条
赋值语句多算法时间就长
2.具体怎么求时间复杂度T(n)
我们看一段简单代码
def sum_of_n(n):total = 0for i in range(1, n + 1):total += ireturn total
第二行对total进行了赋值,只执行一次
第三行for循环为控制流语句,这里计算时间复杂度只计算控制流语句下面的语句,不计算语句本身(没有计算和赋值过程我们都不计算),也就是n*(for语句中语句的条数)
这里的时间复杂度用T(n)函数表示也就是T(n)=1+n
使用这个sun_of_n(n)函数时需要一个n,这里的n我们成为问题的规模
问题的规模:是指影响到这个程序运行时间的指标
我们求算法的时间复杂度函数也就是求运行时间与问题的规模(n)之间的函数关系
有时候决定算法时间复杂度的不仅是问题规模(n)具体数据也会影响算法运行时间
算法也有最好,最差,平均情况,平均状况体现了算法的主流性能
3.大O表示法(数量级函数)
基本操作数量函数T(n)的精确值并不是很重要,重要的是T(n)当中起决定性因素的主导部分
通俗来说就是对时间影响远远大于其他的那部分(这为数级)
例如:上面例子中的n与1相比较,当n越来越大,1显得无足轻重,我们就可以把这个1去掉,只保留n作为主导部分
用大O表示法表示上面的时间复杂度为O(n)
T(n)=5n**2+10n+100
当n越来越大的时候,10n和100常数对时间影响越来越小,n方的系数5对n方的增长速度来讲也没有影响,最终数量级函数为O(n**2),理解为n方 量级的时间复杂度
这里是几个数量级函数
1 | 常数 |
---|---|
log(n) | 对数 |
n | 线性 |
n*log(n) | 对数线性 |
n**2 | 平方 |
n**3 | 立方 |
2**n | 指数 |