3.函数的增长
1.渐近记号
我们将主要使用渐进记号来描述算法的运行时间。渐进记号实际上应用于函数。
θ(n2)=an2+bn+c 这个是插入排序的运行时间表达,我们使用θ(n2)来表示。
我们使用渐近记号来刻画算法的运行时间。
(1) θ 记号
插入排序的最坏运行时间为:T(n) = θ(n²)。
让我们来定义这个记号意指什么。
对于一个给定的函数g(n),用θ(g(n))来表示一下函数的集合:
θ(g(n)) = {f(n):存在正常量c1,c2,n0,使得对所有n ≥ n0,有0 ≤ c1 * g(n) ≤ f(n) ≤ c2 * g(n)}
若存在正常数才c1,c2,使得对于足够大的n,函数f(n)能“夹入”c1*g(n)与c2*g(n)之间,则f(n)属于集合θ(g(n))(通常把f(n) ∈ θ(g(n))记为f(n) = θ(g(n)))。我们称g(n)是f(n)的一个渐进紧确界。
我们介绍了θ记号的一种非形式化的概念,相当于扔掉了低阶项并忽略最高阶项前的系数,让我们通过
使用形式化定义证明1/2n2-3n=θ(n2)来简要地证实这种直觉:
通过选择任何常量c2>=1/2,可以使右边的不等式对任何n>=1的值成立。同样,通过选择任何常量c1<=1/14,可以使左边的不等式对任何n>=7的值成立。因此 通过选择c1=1/14,c2=1/2且n0=7,可以证明1/2n2-3n=θ(n2),
(2) Ο记号
θ记号渐进的给出了一个函数的上界和下界。当只有一个渐进上界时,使用Ο记号。下面给出Ο(g(n))的定义:
Ο(g(n)) = {f(n):存在正常量c,n0,使得对所有n ≥ n0,有0 ≤ f(n) ≤ c * g(n)}
(3) Ω记号
正如Ο记号提供了一个函数的渐进上界一样,Ω记号提供了一个渐进下界。下面给出Ο(g(n))的定义:
Ω(g(n)) = {f(n):存在正常量c,n0,使得对所有n ≥ n0,有0 ≤ c * g(n) ≤ f(n) }
等式和不等式中的渐进记号:
上面我们有写 n=θ(n2),但是还有 2N2+3n+1=2N2+θ(n).
1.当渐进记号独立于等式或者不等式的右边,即不在一个更大的公式内时,如在n=θ(n2)中,我们已经定义等号指集合的成员关系:n 属于O(n2),然而,一般来说 ,当渐进记号出现在某个公式中时,我们将其解释为代表某个我们不关注名称的匿名函数。
2N2+3n+1=2N2+θ(n).意指2N2+3n+1=2N2+f(n)。其中f(n)是集合θ(n)中的某个函数。
按照这种方式使用渐进记号可以帮助消除一个等式中无关紧要的细节和混乱。例如:
归并排序的最坏情况运行时间表示为递归式:
T(n)=2T(n/2)+ θ(n).
如果支队T(n)的渐进行为感兴趣,那么没有必要准确说明所有低阶项,他们都被理解为包含在
由项目θ(n)表示的匿名函数中。
一个表达式中匿名函数的数目可以理解为等于渐进记号出现的次数,酷睿有在表达式
中,只有一个匿名函数(一个i的函数)。因此,这个表达式不同于O(1)+O(2)
+….+O(n),实际上后者没有一个清晰的解释。
- 当渐进记号出现在等式的左边。
无论怎样选择等号左边的匿名函数,总有一种办法来选择等号右边的匿名函数使等式成立。因此,我们的例子意指对任意函数f(n)属于θ(n),存在某个函数g(n)属于θ(n2),换句话说的,等式右边比左边提供的细节更粗糙。
2N2+3n+1=2n2+θ(n)= θ(n2)
(4) ο记号
Ο记号提供的渐进上界可能是也可能不是渐进紧确的。因此我们使用ο记号来表示一个非紧确的渐进上界。定义如下:
ο(g(n)) = {f(n):对于任意的正常量c,存在常量n0,使得对所有n ≥ n0,有0 ≤ f(n) < c * g(n)}
由O记号提供的渐近上街可能是也可能不是渐近紧确的。界2N2=O(n2)是渐近紧确的。但是界2N=O(N2)却不是,我们使用O记号来表示一个非渐近紧确的上界,形式化的定义O(g(n))
(5) ω记号
同上,我们用ω记号来表示一个非紧确的渐进下界。形式化的定义是:
ω(g(n)) = {f(n):对于任意的正常量c,存在常量n0,使得对所有n ≥ n0,有0 ≤ c * g(n) < f(n) }
(6) 等式和不等式中的渐进记号
① 对于形如2n²+3n+1 = 2n²+θ(n)的等式的解释是:2n²+3n+1 = 2n²+f(n),f(n) = θ(n)(f(n) ∈ θ(n))。
② 对于形如 2n² + θ(n) = θ(n²)的等式的解释是:无论怎样选择等号左边的匿名函数,总有办法开选择等号右边的匿名函数来使等式成立。