评估算法的时间复杂度的技巧小结
这篇文章献给澳门理工学院一起努力的同学们,祝大家早日摆脱算法学习的苦海,找到一叶扁舟。
什么是时间复杂度
众所周知,程序运行的时间长短跟硬件和算法都有关系。当人们想要专注于研究算法的优劣时,就要在某种程度上排除硬件差异带来的评估干扰,这时时间复杂度的概念就被发明出来了。
时间复杂度(time complexity),是评估算法好坏的一个指标,关于它的本质,简单概括就是:时间复杂度是一个算法的输入和它运行所需的时间之间的函数特征。
我们把这个输入称之为问题规模,而这个函数特征,并不是一个完全的函数,而是能够表现关系特征的一种函数类型。以下列出了最常见的函数类型,在时间复杂度中,它们表示的效率由高到低:
函数类型 | 表示 |
---|---|
Constant | 1 |
Logarithmic | logn |
Linear | n |
Linearithmic | nlogn |
Quadratic | n2 |
Cubic | n3 |
Exponential | 2n |
时间复杂度可以写作O( )形式,如O( n ), O( nlogn )
朴素方法分析时间复杂度
最朴素的分析时间复杂度的方法就是计算基础操作次数,算出运行次数关于问题规模的函数,提取出特征并得出结论
基础操作大抵包括调用,判断,赋值,读值,等等,其中读值一般特指从列表等数据结构中读取。其他在此不详细讲述了,实际操作中往往不需要使用这种分析方法。
例子:
def list_max(a,n): # 基础操作次数
m = a[0] 2 【赋值,读值】
i = 1 1
while i < n: 1*n 【n是输入的**问题规模** 】
if a[i] > m: 2*(n-1) 【判断,读值】
m = a[i] 2*(n−1)
i = i +1 2*(n−1)
return m 1
total:7n−2
提取特征可得时间复杂度为O(n)
可以发现,所谓提取特征,就是提取原函数中