算法分析:从O符号到复杂度评估
1. O符号简介
O符号是一种用于正式表达算法性能的常见符号。从形式上来说,O符号表示一个函数在常数因子范围内的上界。具体而言,如果g(n)是f(n)的上界,那么对于某个常数c,总能找到一个值n₀,使得当n ≥ n₀时,有f(n) ≤ cg(n)。
通常,我们将算法的性能表示为其处理数据大小的函数。对于大小为n的数据,用函数f(n)来描述算法的性能。不过,虽然很多情况下我们能精确确定f(n),但通常并不需要如此精确。我们主要关注的是f(n)的增长率,它描述了随着处理数据规模的任意增大,算法性能下降的速度。算法的增长率或增长阶非常重要,因为它最终决定了算法对于任意输入的效率,而O符号反映了算法的增长阶。
2. O符号的简单规则
当从增长率的角度看待函数f(n)时,有几个要点很明显:
- 忽略常数项 :随着n的值越来越大,常数项最终会变得无关紧要。例如,若T(n) = n + 50描述了一个算法的运行时间,当n(处理数据的大小)为1024时,常数项在运行时间中所占比例已不到5%。
- 忽略项的常数乘数 :随着n的增加,常数乘数也会变得不重要。例如,若T₁(n) = n²和T₂(n) = 10n描述了解决同一问题的两个算法的运行时间,当n > 10时,T₁就会大于T₂。
- 只考虑最高阶项 :随着n的增加,高阶项会迅速超过低阶项。例如,若T(n) = n² + n描述了一个算法的运行时间,当n = 1024时,低阶项在运行时间中所占比例不到0.1%。
这些思想被形