第三章 函数的增长
第一节 渐近记号
对于足够大的输入,精确运行时间中的倍增常量和低阶项被输入规模本身的影响所支配。
当输入规模足够大,使得只有运行时间的增长量级有关时,我们要研究算法的渐进效率。也就是说,我们关心当输入规模无限增加时,在极限中,算法的运行时间如何随着输入规模的变大而增加。通常,渐近地更有效的某个算法对除很小的输入外的所有情况将是最好的选择。
用来描述算法渐近运行时间的记号根据定义域为自然数集N = {0,1,2,…}的函数来定义。这样的记号对描述最坏情况运行时间函数T(n)是方便的,因为该函数通常只定义在整数输入规模上。然而,有时按照各种方式活用渐近记号是方便的。
Θ记号
- 对其使用渐近记号的函数通常刻画算法的运行时间,但是渐近记号也可以适用于刻画算法的其他方面的函数,甚至可以适用于和算法没有任何关系的函数。
- Θ记号:对于一个给定的函数g(n),用Θ(g(n))来表示以下函数的集合:Θ(g(n))={f(n):存在正常量c1、c2和n0c1、c2和n0,使得对于所有n⩾n0,有0⩽c1g(n)⩽f(n)⩽c2g(n)n⩾n0,有0⩽c1g(n)⩽f(n)⩽c2g(n)},即若存在正常量c1和c2c1和c2,使得对于足够大的n,f(n)能够夹入c1g(n)和c2g(n)c1g(n)和c2g(n)之间,则f(n)属于集合Θ(g(n))。对在n0n0及其右边的所有值,函数f(n)在一个常量因子内等于g(n),我们称g(n)是f(n)的一个渐近紧确界(asymptotically tight bound)。
- O记号为函数给出一个在常量因子内的上界,如果存在正常量c和n0c和n0,使得在n0n0及其右边,f(n)的值总小于或等于cg(n),那么记f(n)=O(g(n))。
- Ω记号为函数给出一个在常量因子内的下界,如果存在正常量c和n0c和n0,使得在n0n0及其右边,f(n)的值总大于或等于cg(n),那么记f(n)=Ω(g(n))。
- Θ(g(n))的定义要求每个成员f(n)属于Θ(g(n))集合均渐近非负,即当n足够大时,f(n)非负,即要求f(n)为渐近正函数。
- 使用形式化证明12n2−3n=Θ(n2)12n2−3n=Θ(n2):首先,确定正常量c1、c2和n0c1、c2和n0,使得对于所有n⩾n0n⩾n0,有c1n2⩽12n2−3n⩽c2n2c1n2⩽12n2−3n⩽c2n2,用n2n2除上式得:c1⩽12−3n⩽c2c1⩽12−3n⩽c2,通过选择任何常量c1⩽114c1⩽114,可以使左边的不等式对任何的n⩾7n⩾7的值成立。同样的,通过选择任何常量c2⩾12c2⩾12,可以使右边的不等式对任何n⩾1n⩾1都成立。因此,通过选择c1=114c1=114,c2=12c2=12且n0=7n0=7,可以证明12n2−3n=Θ(n2)12n2−3n=Θ(n2)。
- 一般来说,对任意多项式p(n)=∑di=0ainip(n)=∑i=0daini,其中aiai为常量且ad>0ad>0,有p(n)=Θ(nd)p(n)=Θ(nd)。一般使用记号Θ(1)来意指一个常量或者关于某个变量的一个常量函数。
O记号
- 对于给定的函数g(n),用O(g(n))来表示以下函数的集合:O(g(n))={f(n):存在正常量c和n0c和n0
,使得对所有n⩾n0n⩾n0,有0⩽f(n)⩽cg(n)0⩽f(n)⩽cg(n)。 - 我们使用O记号来给出函数的一个在常量因子内的上界,对在n0n0及其右边的所有值n,函数f(n)的值总是小于或等于cg(n)。
- 对于给定的函数g(n),用O(g(n))来表示以下函数的集合:O(g(n))={f(n):存在正常量c和n0c和n0
Ω记号
- 对于给定的函数g(n),用Ω(g(n))来表示以下函数的集合:Ω(g(n))={f(n):存在正常量c和n0c和n0
,使得对所有n⩾n0n⩾n0,有0⩽cg(n)⩽f(n)0⩽cg(n)⩽f(n)。 - 我们使用Ω记号来给出函数的一个在常量因子内的下界,对在n0n0及其右边的所有值n,函数f(n)的值总是大于或等于cg(n)。
- 对于给定的函数g(n),用Ω(g(n))来表示以下函数的集合:Ω(g(n))={f(n):存在正常量c和n0c和n0
【定理3.1】
对于任意的两个函数f(n)和g(n),我们有f(n)=Θ(g(n)),当且仅当f(n)=O(g(n))且f(n)=Ω(g(n))
当称一个算法的运行时间为Ω(g(n))时,我们意指对每个n值,不管选择什么特定规模为n的输入,只要n足够大,对那个输入的运行时间至少是g(n)的常数倍。等价地,我们再对一个算法的最好情况运行时间给出一个下界。
等式和不等式中的渐近记号
- 一般来说,当渐近记号出现在某个公式中,我们将其解释为代表某个我们不关注名称的匿名函数。例如,公式2n2+3n+1=2n2+Θ(n)2n2+3n+1=2n2+Θ(n)意指2n2+3n+1=2n2+f(n)2n2+3n+1=2n2+f(n),其中f(n)是集合Θ(n)中的某个函数。
- 一个表达式中匿名函数的数目可以理解为等于渐近记号出现的次数。
o记号
- 我们使用o记号来表示一个非渐近紧确的上界。
- 形式化地定义o(g(n))为以下集合:o(g(n))={f(n):对任意正常量c>0,存在常量n0>0n0>0,使得对所有n⩾n0n⩾n0,有0⩽f(n)<cg(n)0⩽f(n)<cg(n)。
- O记号与o记号的定义类似,主要的区别是在f(n)=O(g(n))中,界0⩽f(n)⩽cg(n)0⩽f(n)⩽cg(n)对某个常量c>0成立,但在f(n)=o(g(n))中,界0⩽f(n)<cg(n)0⩽f(n)<cg(n)对所有常量c>0成立。直观上,在o记号中,当n趋于无穷时,函数f(n)相对于g(n)来说变得微不足道了。
ω记号
- ω记号与Ω记号的关系类似于o记号与O记号的关系。
- 我们使用ω记号来表示一个非渐近紧确的下界。
- ω记号的定义为:f(n)∈ω(g(n))当且仅当g(n)∈o(f(n))。
- 形式化定义ω(g(n))为以下集合:ω(g(n))={f(n):对任意正常量c>0,存在常量n0>0n0>0,使得对所有n⩾n0n⩾n0,有0⩽cg(n)<f(n)0⩽cg(n)<f(n)。直观上,当n趋于无穷时,f(n)相对于g(n)来说变得任意大了。
渐近记号的性质
- 传递性
- f(n)=Θ(g(n))且g(n)=Θ(h(n)) 蕴涵f(n)=Θ(h(n))
- f(n)=O(g(n))且g(n)=O(h(n)) 蕴涵f(n)=O(h(n))
- f(n)=Ω(g(n))且g(n)=Ω(h(n)) 蕴涵f(n)=Ω(h(n))
- f(n)=o(g(n))且g(n)=o(h(n)) 蕴涵f(n)=o(h(n))
- f(n)=ω(g(n))且g(n)=ω(h(n)) 蕴涵f(n)=ω(h(n))
- 自反性
- f(n)=Θ(f(n))
- f(n)=O(f(n))
- f(n)=Ω(f(n))
- 对称性
- f(n)=Θ(g(n))当且仅当g(n)=Θ(f(n))
- 转置对称性
- f(n)=O(g(n))当且仅当g(n)=Ω(f(n))
- f(n)=o(g(n))当且仅当g(n)=ω(f(n))
- f(n)=O(g(n)类似于a⩽ba⩽b
- f(n)=Ω(g(n)类似于a⩾ba⩾b
- f(n)=Θ(g(n)类似于a=ba=b
- f(n)=o(g(n))类似于a<ba<b
- f(n)=ω(g(n))类似于a>ba>b
- 若f(n)=o(g(n)),则称f(n)渐近小于g(n);若f(n)=ω(g(n)),则称f(n)渐近大于g(n)。
- 对于任意两个实数a和b,必然存在a<b、a>b、a=ba<b、a>b、a=b三者之一成立,称为实数的三分性;而对于渐近符号,则不存在三分性。
- 传递性