最坏情况分析
通常评判算法性能的三种情况:
- 最佳情况
- 平均情况
- 最坏情况
算法在不同的情况下性能差异可能很大。比如一种简单的线性搜索算法,它从数据集头部遍历到尾部查找一个数据。最好情况是要查找的元素在数据集的第一个位置,平均情况是可能在数据集中间的某个位置找到该元素,最坏情况是该元素位于数据集最后一个位置,需要遍历所有元素才能找到该元素。
为什么要考虑最坏情况
- 许多算法在最坏情况下会消耗相当长的时间
- 考虑算法在最佳情况下的性能无多大意义
- 分析算法在平均情况下的性能往往不易,甚至很难去界定哪种情况是平均情况。
- 最坏情况可以告诉我们算法性能的上限,分析一个算法的最坏情况可以保证在其他任何情况下,此算法的表现都不会比最坏情况差,其他情况肯定比最坏情况要好。
O表示法
O表示法是用来表示算法性能的最常见最正式的标记法。在一定情况下,O表示法指明了一个函数的上限值。对于大小为n的数据,我们用函数f(n)来表示它的性能,0我们需要关注的是当算法处理的数据量变得无穷大时,算法的性能去进一个什么样的值,当n无穷大时,它可以用来描述算法的效率到底有多高。
O表示法简单规则
- 常数项用O(1)表示,当分析一个算法的运行时间时,如果知道无论它处理多大的数据量,它都至少得消耗一段固定的时间,那么就可以用常数项表示此固定的时间,对于某些常数c,正式的表述为: O( c ) = O(1)
- 常数因子往往被忽略。
O( cT ) = cO(T) = O(T) - 加法运算取最大值。例如,有两个顺序执行的任务,其运行时间分别为:n和n^2
运行结果表示为O(n)+O(n ^2)。
根据规则,可以简化为O(n^2)。
正式表述为:
O(A) + O(B) = O(A+B) = max(O(A)+O(B)) - 乘法结果不需要改变。如果一个任务的执行引起了另一个任务的迭代执行,可以运用此规则。如在一个嵌套循环中,外层迭代为A,内层迭代为B,如果都为O(n),则结果为O(n^2).
真是的表述为:
O(A) O(B) = O(AB)
计算的复杂度
O表示法能够描述一个算法的复杂度。
常见复杂计算的复杂度:
O(1)-----------------从一个数据集中获取第一个元素
O(lg n)--------------将一个数据集分成两半,然后将分开的每一半再分成两半,以此类推,遍历一个数据集
O(n)-----------------遍历一个数据集
O(n lg n)--------------将一个数据集分成两半,然后将分开的每一半再分成两半,以此类推,遍历一个数据集,此过程中同时遍历一遍每一半数据
O(n^2)--------------遍历一个数据集中的每个元素的同时遍历另一个数量级相同的数据集
O(lg n)--------------将一个数据集分成两半,然后将分开的每一半再分成两半,以此类推,遍历一个数据集
O(2^n)--------------为一个数据集生成其可能的所有子集
O(n!)--------------为一个数据集生成其可能的所有排列组合