本系列为《Python数据结构与算法分析》第二版学习笔记,作者:布拉德利.米勒;戴维.拉努姆。
算法分析关心的是基于所用的计算资源比较算法。我们说甲算法比乙算法好,依据是甲算法有更高的资源利用率或使用更少的资源。
计算资源究竟指什么?一是考虑算法在解决问题时要占用的空间或内存,二是根据算法执行所需的时间进行分析和比较.
一个算法的具体实例的执行时间不是一个有用指标,因为它依赖于特定的计算机、程序、时间、编译器和编程语言。如果要摆脱程序或计算机的影响来描述算法的效率,量化算法的操作或步骤很重要。
1、大O记法
如果将每一步看成基本计算单位,那么算法的执行时间可以描述为解决问题的步骤数,以计算前N个整数之和为例:
def sumOfN(n):
theSum = 0
for i in range(1, n+1):
theSum = theSum + i
return theSum
该算法执行完整的步骤数T(n) = 1 + n, 参数n被称作“问题规模”。在计算机科学中,精确的步骤数并没有T(n)函数中起决定性作用的部分重要。也就是说,随着问题规模的增长,T(n)函数的某一部分会比其余部分增长的更快,最后比较的其实就是这一起决定性作用的部分。
数量级函数描述的就是,当n增长时,T(n)增长最快的部分,数量级常被称作大O记法(O指order),记作O(f(n)),它提供的是步骤数的一个有用的近似算法。
再比如,某个算法的步骤数是:
当n很小时,比如说1或2,常熟1005看起来是这个函数中起决定性作用的部分。然而随着n的增长,n2变的很重要。实际上,当n很大时,另两项的作用对于最终结果来说就不显著了,因此可以忽略这两项,只关注5n2。另外,当n足够大时,系数5的作用也不重要了,因此可以说,函数T(n)的数量级是f(n) = n2,或者直接说是O(n2)。
常见的大O函数
Python列表操作的大O效率
Python字典操作的大O效率