算法的渐进分析(asymptotic algorithm analysis)简称算法分析。算法分析直接与它所求解的问题的规模 n 有关,因此,通常将问题规模作为分析的参数,求算法的时间和空间开销与问题规模的关系。
渐进的时间复杂度
计算程序步数的目的是想比较两个或多个完成相同功能的程序的时间复杂度,并估计当问题规模变化时,程序的运行时间如何随之变化。
要确定一个程序的准确的程序步数是非常困难的,而且也不是很必要。因为程序步数这个概念本身不是一个精确的概念。例如,赋值语句 x=a 和 x=a+b*(c-d)-e/f 居然具有相同的程序步数。
由于程序步数不能确切的反映运行时间,所以用精确的程序步数来比较两个程序,其结果不一定有价值。前面讨论迭代求和程序与递归求和程序的程序步数时,程序步数为 3n+2 的程序反而比程序步数为 3n+4 的程序运行时间多。但是,当两个程序的程序步数相差很大时,例如一个是 ⌈ log 2 ( n + 1 ) ⌉ \lceil\log_2(n+1)\rceil ⌈log2(n+1)⌉,另一个是 n ∗ ( n − 1 ) / 2 n*(n-1)/2 n∗(n−1)/2 时,明显后者比前者运行时间多。
因此,如果精确计算有困难,我们只要能够得出一个是 log 2 n \log_2n log2n的数量级,一个是 n 2 n^2 n2的数量级,后者比前者运行时间多的结论,也能达到分析的目的。
大 O O O 渐进表示
要全面分析一个算法,需要考虑算法在最坏情况下的时间代价,在最后情况下的时间代价,在平均情况下的时间代价。对于最坏情况,主要采用大 O O O 表示法来描述。
大 O O O 表示法的一般前提是:当且仅当存在正整数 c c c 和 n 0 n_0 n0,使得 T ( n ) ≤ c f ( n ) T(n)\leq cf(n) T(n)≤cf(n),使得所有的 n ≥ n 0 n\geq n_0 n≥n0 成立,则称该算法的时间增长率在 O ( f ( n ) ) O(f(n)) O(f(n)) 中,记为 T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) <