算法的渐进分析(asuymptotic algorithm analysis)
简称算法分析。算法分析直接与它所求解的问题的规模n有关,因此,通常将问题规模作为分析的参数,求算法的时间和空间开销与问题规模n的关系。
渐进的时间复杂度
计算程序执行频度的目的是相比较两个或多个完成相同功能的程序的时间复杂度,并估计但问题规模变化时,程序的运行时间如何随之变化。
要想确定一个程序的准确的执行频度有时是非常困难的,而且也不是很必要。因为程序执行频度这个概念本身就不是一个精确的概念。如赋值语句x=a和x=a+b*(c-d)-e/f居然有相同的执行频度。
由于执行频度不能确切地反映运行时间,所以用精确的程序执行频度来比较两个程序,其结果不一定有价值。
如程序1-20所示递归求和算法的执行频度为2n+2,如果把它改成非递归程序,其语句执行频度反而是2n+3,比递归程序的运行时间还要多,这是不合理的。
因此,只要给出算法的执行频度的数量级,从n增长过程中分析算法执行次数增大的数量级,即可达到分析的目的。
大O表示
在多数情况下,只要得到一个估计值就足够了。若没有问题的规模为n,程序的时间复杂度为T(n),当n增大时,T(n)也随之变大。可是T(n)将如何精确地变化,需要分析程序内部结构,使用大O表示法描述该程序时间复杂度的估计值。
大O表示法的一般提法是:当且仅当存在正整数c和n0,使得T(n)≤cf(n)对所有n≥n0成立,则称该算法的时间增长率在O(f(n))中,记为T(n)=O(f(n))。
就是说,随着问题规模n逐步增大,算法的时间复杂度也在增加。从数量级大小考虑,算法的程序语句的执行次数(是n的函数)是最坏情况下存在一个增长的上限,即cf(n),即算法的增长率的上限为O(f(n)。
[例 1-21] 考察f(n)=3n+2。当n≥2时,3n+2≤3n+n=4n,所以f(n)=O(n),f(n)是一个变化的函数。
[例 1-22] 考察f(n)=10n²+4n+2.当n≥2时,有10n²+4n+2≤10n²+5n,当n≥5时,有5n≤n²,因此,对于n≥5,f(n)≤10n²+n²=11²,f(n)=O(n²)。
[例 1-23] 考察f(n)=6×2^n+n²。当n≥4,有n²≤2 ^n,所以对于n≥4,有f(n)≤6×2 ^n+2 ^n=7×2 ^n,因此f(n)=O(2 ^n).
[例 1-24] 考察f(n)h=9。当n0-0,c=9,即可得到f(n)=O(1)。