1.大写Ο符号
大写Ο符号给出了函数f的一个上限。
定义[大写Ο符号]:f(n)=Ο(g(n)),当且仅当存在正的常数c和n0,使得对于所有的n≥n0,有 f(n)≤c*g(n)
上述定义表明,函数f至多是函数g的c倍,除非n小于n0。因此,对于足够大的n(如n≥n0),g 是 f 的一个上限(不考虑常数因子 c )。
在为函数 f 提供一个上限函数 g 时,通常使用比较简单的函数形式。比较典型的形式是含有 n 的单个项(带一个常数系数)。对于对数函数logn,没有给出对数的基数,是因为对于任何大于1的常数 a 和 b ,都有:logan=logbn/logba所以logan和logbn都有一个相对的乘法系数1/logba,其中 a 是一个常量。
2. Ω符号
Ω符号给出了函数f的一个下限。
定义[Ω符号]:f(n)=Ω(g(n)),当且仅当存在正的常数c和n0,使得对于所有的n≥n0,有 f(n)≥c*g(n)。
上述定义表明,函数f至少是函数 g 的 c 倍,除非 n 小于 n0。因此,对于足够大的n(如n≥n0),g 是 f 的一个下限(不考虑常数因子c )。与大Ο定义的应用一样,通常使用单项形式的 g 函数。g(n)仅是f(n)的一个下限,与大Ο符号的情形类似,也可能存在多个函数g(n)满足f(n)=Ω(g(n))。
为了使f(n)=Ω(g(n))更有实际意义,其中的 g(n) 应足够大。因此,有3n+3=Ω(n),6*2n+n2=Ω(n2)。而3n+3=Ω(l),6*2n+n2=Ω(n)不是所希望的,尽管他们也是正确的。
3. Θ符号
Θ符号适用于同一个函数g既可以作为f的上限,也可以作为f的下限的情形。
定义[Θ符号]:f(n)=Θ(g(n)),当且仅当存在正的常数c1,c2和n0,使得对于所有的n≥n0,有 c1g(n)≤f(n)≤c2g(n)。
定义表明,函数f介于函数g的c1倍和c2倍之间,除非n<n0。因此对于足够大的n(如n≥n0), g既是f的上限,也是f的下限(不考虑常数因子c)。与大Ο定义和Ω定义的应用一样,通常仅使用单项形式的g函数。
4.小写o符号
定义[小写o]:f(n)=o(g(n))当且仅当
f(n)=Ο(g(n))且f(n)≠Ω(g(n))。
图3.1列出了一些常用的有关Ο、Ω和Θ的标记,其中,除n以外所有符号均为正常数。图3.1 渐近标记(其中⊕可以Ο、Ω、Θ是之一)
图3.2给出了一些关于“和”与“积”的有用的引用规则。对于图3.2的引用规则,大家不难举例验证。
在时间或步数的渐近表示中,利用了图3.1和图3.2的结论。注意,首先要知道程序完成什么功能,然后分析程序的执行时间和执行步数,再采用渐近表示记录它们,最后根据图3.1和图3.2得到结果。
有时,可以把Ο(g(n))、Ω(g(n))和Θ(g(n))分别解释成如下集合:
Ο(g(n))={f(n)|f(n)=Ο(g(n))}
Ω(g(n))={f(n)|f(n)=Ω(g(n))}
Θ(g(n))={f(n)|f(n)=Θ(g(n))}
在这种解释下,诸如Ο(g1(n))=Ο(g2(n))和Θ(g1(n))=Θ(g2(n))这样的语句就有了明确的含义。因为,此时可以将f(n)=Ο(g(n))读作“f(n)是g(n)的一个大Ο成员”,另外两种的读法也类似。
小写o符号通常用于执行步数的分析。执行步数3n+Ο(n)表示3n加上上限为n的项。在进行这种分析时,可以忽略步数少于Θ(n)的程序部分。
可以扩充Ο、Ω、Θ和o的定义,采用具有多个变量的函数。例如,
f(m,n)=Ο(g(n,m))当且仅当存在正常量c、n0和m0,使得对于所有的n≥n0和所有的m≥m0,有f(m,n)≤c*g(n,m)。