(一)时间复杂度
算法的时间复杂度分析主要是分析算法的运行时间,即算法执行所需要的基本操作数。
不同规模的输入所需要的基本操作数是不相同的,因此考虑特定输入规模的算法的具体操作数既是不现实的也是不必要的。
在算法分析中,可以建立以输入规模n
为自变量的函数T(n)
来表示算法的时间复杂度。
根据不同的输入,将算法的时间复杂度分析分为三种情况:
- 最佳情况
- 最坏情况
- 平均情况
平均情况的时间复杂度分析可以按以下三个步骤进行:
- 将所有的输入按其执行时间分类;
- 确定每类输入发生的概率;
- 确定每类输入的执行时间。
(二)渐进符号
以输入规模n
为自变量建立的时间复杂度实际上还是比较复杂的,例如an²+bn+c
,不仅与输入规模有关,同时还与系数a、b、c
有关。
此时可以对该函数做进一步的抽象,仅考虑运行时间的增长率或增长的量级,如,仅考虑n²
。
当输入规模大到只有与运行时间的增长量级有关时,就是在研究算法的渐进效率。也就是说,从极限角度看,只关心算法运行时间如何随着输入规模的无限增长而增长。
三种常用的标准方法来简化算法的渐进分析:
Ο
记号
用该记号给出一个算法运行时间的渐进上界。Ω
记号
用该记号给出一个算法运行时间的渐进下界。Θ
记号
用该记号给出一个算法运行时间的渐进上界和渐进下界,即渐进紧致界。
(三)递归式
从算法的结构上看,算法可以分为非递归形式和递归形式。
非递归算法的时间复杂度分析较简单,我们主要讨论递归算法的时间复杂度分析方法。
1. 展开法
将递归式中等式右边的项根据递归式进行替换,称为展开。展开后的项被再次展开,如此下去,直到得到一个求和表达式,得到结果。
2. 代换法
这一名称来源于当归纳假设用较小值时,用所猜测的值代提函数的解。
用代换法解递归式时需要三个步骤:
- 猜测解的形式;
- 用数学归纳法证明猜测的正确性;
- 求出使解真正有效的常数。
使用代换法需要经验,不存在通用的方法来猜测递归式的正确解,因此这种方法比较难用。
3. 递归树法
递归树法弥补了代换法猜测困难的缺点,它适用于提供“好”的猜测,然后用代换法证明。
在递归树中,每一个结点都代表递归函数调用集合中一个子问题的代价。将树中每一层内结点的代价相加得到一个每层代价的集合,再将每层的代价相加得到递归式所有层的总代价。
当用递归式表示分治算法的时间复杂度时,递归树方法尤其有用。
4. 主方法
主方法也称为主定理。给出了递归式求解的快速方法。