2.3.4 上下界
在本书中,我们简化了“大O”表示法,目的是对不同问题样本在持续增长的规模n下算法性能进行分类。这种分类使用O(f(n))表示,其中f(n)是一些如n、n3或者2n的常见函数。
例如,假设存在一个算法,当输入数据规模“足够大”时,它在最坏情况下的性能绝不大于和输入问题样本规模成比例的某个值。更加精确地说,对于所有的n > n0,存在某个常数c > 0,满足t(n) ≤ cn ,其中n0是每个问题样本“足够大时”的基本点。在这种情况下,分类函数f(n) = n,采用O(n)进行表示。如果对于同样的算法,假定它在最好情况下的性能绝不小于和输入问题的样本规模成比例的某个值,即对于所有的n > n0,存在不同的常数c和问题规模临界值n0,满足t(n) ≥ cn。那么在这种情况下的分类依然是f(n) = n,但是会采用Ω(n)进行表示。
正式符号的总结如下:
算法执行时间的下界记作Ω(f(n)),对应于最好情况。
算法执行时间的上界记作O(f(n)),对应于最坏情况。
考虑上述两种情况是有必要的。细心的读者会指出,使用函数f(n) = c*2n也可以将上述算法归类为O(2n),尽管这种方式描述了一种更慢的行为。这么描述虽然没错,但是提供的信息量太少,就好比说,你需要花上不多于一个星期的时间完成一个只需要5min就能完成的任务。在本书中,我们总是使用最接近的匹配表示算法分类。
在复杂性理论中,还有一种Θ(f(n))表示,它融合了上下界的思想,用于描述精确的紧界(tight bound),即下界为Ω(f(n))时,上界则是使用相同分类函数f(n)的O(f(n))。我们采用更为广泛接受的(更加非正式一些的)O(f(n))来简化算法表示和分析。我们保证,在讨论算法性能时,如果一个算法被认定为O(f(n)),一定不会存在更为精确的f'(n)可以对算法进行分类。