每日一个小问题:一个算法的优劣该是用什么来判断呢?
答:这时就可以计算时间复杂度了,时间复杂度就是你在这个程序中,最耗时的部分耗了多久的时间。
在此之前我们先来学习一下时间复杂度吧!
1.时间复杂度的介绍
算法的复杂度是评估算法性能优劣一个重要的指标,可以帮助信息学竞赛选手估算出算法在执行之后所需要的时间和空间,所以分析算法的复杂度几乎成了每个 OIer 必须掌握的能力。
2.时间复杂度的定义以及常用范围
定义
在计算算法的运行时间时,对于足够大的输入规模来说,我们关心的是运行时间的增长量级,也就是研究算法的渐进效率。首先定义几个渐进记号。
可以发现,O表示渐进上界,Ω表示渐进下界,而上下界相等时,就能用 Θ表示了。此外,还有 O 和 w 分别表示非紧确的渐进上下界。
常用范围
在介绍时间复杂度之前,我们需要引入 时间频度 的概念。时间频度是指算法中语句的执行次数,用 T(n)来表示,n 为问题的规模。
在算法竞赛中,一般为了理解方便,只用 o 记号表示复杂度。简单来说,用时间频度的表达方法不够简洁,于是引入了时间复杂度的概念。如果有一个辅助函数
f(n),在
n 趋向于无穷大时,
T(n)/f(n) 的极限值为不等于 0 的常数,则我们近似的将
f(n) 替代 T(n),记为 T(n)=O(f(n)),称为算法的渐进时间复杂度。
时间复杂度只关心算法中最耗时的部分,舍去常数部分,通常用简单的函数来表示。例如,某算法时间频度 T(n)=2n3+4n2+n,则它的时间复杂度为
O(n3)。按效率从高到低排列,时间复杂度一般有以下几种:
我们举个例子来描述下算法时间复杂度的计算过程吧。
现有如下代码,可以计算出语句
1
执行了n2 次,语句
2
执行了 n 次,语句
3
执行了logn 次,则 T(n)=n2+n+logn,取其中最耗时部分,则时间复杂度为
O(n2)。
3.每日小问题的解法