3.1 渐近记号

当输入规模足够大,使得只有运行时间的增长量级有关时,我们要研究算法的渐近效率。我们关心当输入规模无限增加时,在极限中,算法运行时间如何随着输入规模的变大而增加。通常,渐近地更有效的某个算法对除很小的输入外的所有情况将是最好的选择。

用来描述算法渐近运行时间的记号根据定义域为自然数集N={0, 1, 2, ...}的函数来定义。我们把插入排序的最坏情况运行时间刻画为an^2+bn+c,其中abc是常量。通过把插入排序的运行时间写成\Theta (n^2),我们除去了该函数的某些细节。当前的\Theta (n^2)等同于an^2+bn+c,为插入排序的最坏情况运行时间。

但我们常常希望做出一种综合性地覆盖所有输入而不仅仅是最坏情况的陈述。

\Theta记号

通过插入排序的最坏情况运行时间为T(n)=\Theta (n^2)。这里\Theta记号的意义为:对一个给定的函数g(n),用\Theta (g(n))来表示以下函数的集合:

\Theta (g(n)))={f(n)使得存在正常量c_1c_2n_0,使得对所有nn_0,有0≤c_1g(n)f(n)c_2g(n)}

若存在正常量c_1c_2,使得对于足够大的n,函数f(n)能夹入c_1g(n)c_2g(n)之间,则f(n)属于集合\Theta (g(n))。对在n_0及其右边n的所有值,f(n)的值位于或高于c_1g(n)且位于或低于c_2g(n)。换句话说,对所有nn_0,函数f(n)在一个常量因子内等于g(n)。我们称g(n)f(n)的一个渐近紧缺界。

O记号

\Theta记号渐近地给出一个函数的上界和下界。当只有一个渐近上界时,使用O记号。对于给定的函数g(n),用O(g(n))来表示以下函数的集合:

O(g(n)))={f(n):存在正常量cn_0,使得对所有nn_0,有0≤f(n)cg(n)

O记号来给出函数的一个在常量因子内的上界。使用O符号我们可以通过检查算法的总体结构来描述算法的运行时间。例如,插入排序算法的双重嵌套循环结构对最坏情况运行时间立即产生一个O(n^2)的上界:内层嵌套循环每次迭代的代价以O(1)(常量)为上界,下标ij均最多为n,对于n^2ij值对的每一对,内循环最多执行一次。

\Omega记号

O记号提供了一个函数的渐近上界,\Omega记号提供了渐近下界。对于给定的函数g(n),用\Omega (g(n))来表示以下函数的集合:

\Omega (g(n))={f(n):存在正常量cn_0,使得对所有nn_0,有0≤cg(n)f(n)

定理:对任意两个函数f(n)g(n),我们有f(n)=\Theta (g(n)),并且仅当f(n)=O(g(n))f(n)=\Omega (g(n))

关于任意常量abc,其中a>0,有an^2+bn+c=\Theta (n^2)的证明直接蕴含an^2+bn+c=\Omega (n^2)an^2+bn+c=O(n^2)。当称一个算法的运行时间为\Omega (g(n))时,我们意指对每个n值,不管选择什么特定的规模为n的输入,只要n足够大,对那个输入的运行时间至少是g(n)的常量倍。

o记号

O记号提供的渐近上界可能是也可能不是渐近紧确的界2n^2=O(n^2)是渐近紧确的,但是2n=O(n^2)却不是。我们使用o记号来表示一个非渐近紧确的上界。用o (g(n))来表示以下集合:

o (g(n))={f(n):对任意正常量c>0,存在常量n_0>0,使得对所有nn_0,有0≤f(n)<cg(n)

\omega记号

\omega记号与\Omega记号的关系类似于o记号与O记号的关系。我们使用\omega记号来表示一个非渐近紧确的下界。用\omega (g(n))来表示以下集合:

\omega (g(n))={f(n):对任意正常量c>0,存在常量n_0>0,使得对所有nn_0,有0≤cg(n)<f(n)

 

 

 

展开阅读全文

没有更多推荐了,返回首页