第三章、函数的增长 -- 渐近记号

渐近记号、函数与运行时间

Θ 记 号 \Theta记号 Θ

对一个给定的函数 g ( n ) g(n) g(n),用 Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))来表示一下函数的集合:
Θ ( g ( n ) ) = { f ( n ) : 存 在 正 常 量 c 1 、 c 2 和 n 0 , 使 得 对 所 有 n ≥ n 0 , 有 0 ≤ c 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) } \Theta(g(n))=\{f(n):存在正常量c_1、c_2和n_0,\\ 使得对所有n\geq n_0,有0\leq c_1g(n)\leq f(n)\leq c_2g(n)\} Θ(g(n))={f(n):c1c2n0,使nn0,0c1g(n)f(n)c2g(n)}

若存在正常量 c 1 c_1 c1 c 2 c_2 c2,使得对于足够大的 n n n,函数 f ( n ) f(n) f(n)能“夹入” c 1 g ( n ) c_1g(n) c1g(n) c 2 g ( n ) c_2g(n) c2g(n)之间,则 f ( n ) f(n) f(n)属于集合 Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))。因为 Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))是一个集合,所以可以记 f ( n ) ∈ Θ ( g ( n ) ) f(n)\in \Theta(g(n)) f(n)Θ(g(n)),以指出 f ( n ) f(n) f(n) Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))的成员,作为替代,我们通常记 f ( n ) = Θ ( g ( n ) ) f(n)=\Theta(g(n)) f(n)=Θ(g(n))以表达相同的概念。

下图给出了函数 f ( n ) f(n) f(n) g ( n ) g(n) g(n)的一幅直观画面,其中 f ( n ) = Θ ( g ( n ) ) f(n)=\Theta(g(n)) f(n)=Θ(g(n))。对在 n 0 n_0 n0及其右边 n n n的所有值, f ( n ) f(n) f(n)的值位于或高于 c 1 g ( n ) c_1g(n) c1g(n)且位于或低于 c 2 g ( n ) c_2g(n) c2g(n)。换句话说,对所有 n ≥ n 0 n\geq n_0 nn0,函数 f ( n ) f(n) f(n)在一个常量因子内等于 g ( n ) g(n) g(n)。我们称 g ( n ) g(n) g(n) f ( n ) f(n) f(n)的一个渐进紧确界。

图1

Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))的定义要求每个成员 f ( n ) ∈ Θ ( g ( n ) ) f(n)\in\Theta(g(n)) f(n)Θ(g(n))均渐近非负,即当 n n n足够大时, f ( n ) f(n) f(n)非负。因此,函数 g ( n ) g(n) g(n)本身必为渐近非负,否则集合 Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))为空。所以我们假设用渐近记号中的函数都渐近非负。

O O O记号

Θ \Theta Θ记号渐近地给出一个函数的上界跟下界。当只有一个渐近上界时,使用 O O O记号。
Θ ( g ( n ) ) = { f ( n ) : 存 在 正 常 量 c 和 n 0 , 使 得 对 所 有 n ≥ n 0 , 有 0 ≤ f ( n ) ≤ c g ( n ) } \Theta(g(n))=\{f(n):存在正常量c和n_0,\\ 使得对所有n\geq n_0,有0\leq f(n)\leq cg(n)\} Θ(g(n))={f(n):cn0,使nn0,0f(n)cg(n)}

Ω \Omega Ω记号

正如 O O O记号提供了一个函数的渐近上界, Ω \Omega Ω记号提供了渐近下界。
Ω ( g ( n ) ) = { f ( n ) : 存 在 正 常 量 c 和 n 0 , 使 得 对 所 有 n ≥ n 0 , 有 0 ≤ c g ( n ) ≤ f ( n ) } \Omega(g(n))=\{f(n):存在正常量c和n_0,\\ 使得对所有n\geq n_0,有0\leq cg(n)\leq f(n)\} Ω(g(n))={f(n):cn0,使nn0,0cg(n)f(n)}

o o o记号

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

o ( g ( n ) ) = { f ( n ) : 存 在 正 常 量 c &gt; 0 , 存 在 常 量 n 0 &gt; 0 , 使 得 对 所 有 n ≥ n 0 , 有 0 ≤ f ( n ) &lt; c g ( n ) } o(g(n))=\{f(n):存在正常量c&gt;0,存在常量n_0&gt;0,\\ 使得对所有n\geq n_0,有0\leq f(n)&lt;cg(n)\} o(g(n))={f(n):c>0n0>0,使nn0,0f(n)<cg(n)}

ω \omega ω记号

使用 ω \omega ω记号来表示一个非渐近紧确的下界。

ω ( g ( n ) ) = { f ( n ) : 存 在 正 常 量 c &gt; 0 , 存 在 常 量 n 0 &gt; 0 , 使 得 对 所 有 n ≥ n 0 , 有 0 ≤ c g ( n ) &lt; f ( n ) } \omega(g(n))=\{f(n):存在正常量c&gt;0,存在常量n_0&gt;0,\\ 使得对所有n\geq n_0,有0\leq cg(n)&lt;f(n)\} ω(g(n))={f(n):c>0n0>0,使nn0,0cg(n)<f(n)}

渐近记号的性质

传递性:

如: f ( n ) = Θ ( g ( n ) )     且     g ( n ) = Θ ( h ( n ) )     蕴 含     f ( n ) = Θ ( h ( n ) ) f(n)=\Theta(g(n))\ \ \ 且\ \ \ g(n)=\Theta(h(n))\ \ \ 蕴含\ \ \ f(n)=\Theta(h(n)) f(n)=Θ(g(n))      g(n)=Θ(h(n))      f(n)=Θ(h(n))

其他的也具体有此性质。


自反性:

如: f ( n ) = Θ ( f ( n ) ) f(n)=\Theta(f(n)) f(n)=Θ(f(n))

其他的也具体有此性质。


对称性:

f ( n ) = Θ ( g ( n ) )    当 且 仅 当    g ( n ) = Θ ( f ( n ) ) f(n)=\Theta(g(n))\ \ 当且仅当\ \ g(n)=\Theta(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))\ \ 当且仅当\ \ g(n)=\Omega(f(n)) \\ f(n)=o(g(n))\ \ 当且仅当\ \ g(n)=\omega(f(n)) f(n)=O(g(n))    g(n)=Ω(f(n))f(n)=o(g(n))    g(n)=ω(f(n))

因为这些性质对渐近记号成立,所以可以在两个函数 f f f g g g的渐近比较和两个实数 a a a b b b的比较之间做一种类比。
f ( n ) = O ( g ( n ) )    类 似 于    a ≤ b f ( n ) = Ω ( g ( n ) )    类 似 于    a ≥ b f ( n ) = Θ ( g ( n ) )    类 似 于    a = b f ( n ) = o ( g ( n ) )    类 似 于    a &lt; b f ( n ) = ω ( g ( n ) )    类 似 于    a &gt; b \begin{aligned} &amp;f(n) = O(g(n))\ \ 类似于\ \ a\leq b\\ &amp;f(n) = \Omega(g(n))\ \ 类似于\ \ a\geq b\\ &amp;f(n) = \Theta(g(n))\ \ 类似于\ \ a=b\\ &amp;f(n) = o(g(n))\ \ 类似于\ \ a&lt;b\\ &amp;f(n) = \omega(g(n))\ \ 类似于\ \ a&gt;b\\ \end{aligned} f(n)=O(g(n))    abf(n)=Ω(g(n))    abf(n)=Θ(g(n))    a=bf(n)=o(g(n))    a<bf(n)=ω(g(n))    a>b
然而,不是所有的函数都能用渐近记号:
对于两个函数 f ( n ) f(n) f(n) g ( n ) g(n) g(n),也许 f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n)=O(g(n)) f ( n ) = Ω ( g ( n ) ) f(n)=\Omega(g(n)) f(n)=Ω(g(n))都不成立。例如我们不能使用渐近记号来比较函数 n n n n 1 + s i n   n n^{1+sin\ n} n1+sin n,因为 n 1 + s i n   n n^{1+sin\ n} n1+sin n中的幂值在0跟2之间摆动,取介于两者之间的所有值。

对于渐近记号的理解

对于插入排序,可以有插入排序的最坏情况运行时间为 Θ ( n 2 ) \Theta(n^2) Θ(n2) O ( n 2 ) O(n^2) O(n2) Ω ( n 2 ) \Omega(n^2) Ω(n2);插入排序的最好情况运行时间为 Θ ( n ) \Theta(n) Θ(n) O ( n ) O(n) O(n) Ω ( n ) \Omega(n) Ω(n),甚至是 o ( n 2 ) o(n^2) o(n2)

对于归并排序,可以有归并排序的最坏情况运行时间为 Θ ( n l g n ) \Theta(nlgn) Θ(nlgn) O ( n l g n ) O(nlgn) O(nlgn) Ω ( n l g n ) \Omega(nlgn) Ω(nlgn);归并排序的最好情况运行时间为 Θ ( n l g n ) \Theta(nlgn) Θ(nlgn) O ( n l g n ) O(nlgn) O(nlgn) Ω ( n l g n ) \Omega(nlgn) Ω(nlgn)

如果描述某个算法的运行时间为 Θ ( n 2 ) \Theta(n^2) Θ(n2),蕴含着该算法的最好情况的运行时间与最坏情况的运行时间都为 Θ ( n 2 ) \Theta(n^2) Θ(n2)

如果描述某个算法的运行时间为 O ( n 2 ) O(n^2) O(n2),蕴含着该算法的最坏情况运行时间为 O ( n 2 ) O(n^2) O(n2)

如果描述某个算法的运行时间为 Ω ( n 2 ) \Omega(n^2) Ω(n2),蕴含着该算法的最好情况运行时间为 Ω ( n 2 ) \Omega(n^2) Ω(n2)
图2

0.5 ∗ ( f ( n ) + g ( n ) ) ≤ m a x ( g ( n ) , g ( n ) ) ≤ ( f ( n ) + g ( n ) ) 0.5*(f(n)+g(n)) \leq max(g(n),g(n)) \leq (f(n)+g(n)) 0.5(f(n)+g(n))max(g(n),g(n))(f(n)+g(n))

图3

n ≥ ∣ a ∣ n\geq |a| na,有 ( n + a ) b ≤ ( 2 n ) b (n+a)^b\leq (2n)^b (n+a)b(2n)b,所以存在 c = 2 b c=2^b c=2b n 0 = ∣ a ∣ n_0=|a| n0=a,当 n ≥ n 0 n\geq n_0 nn0时,有 0 ≤ ( n + a ) b ≤ c ( n b ) 0\leq (n+a)^b\leq c(n^b) 0(n+a)bc(nb),所以 ( n + a ) b = O ( n b ) (n+a)^b=O(n^b) (n+a)b=O(nb)

n ≥ 2 ∣ a ∣ n\geq 2 |a| n2a,有 ( n + a ) b ≥ ( n / 2 ) b (n+a)^b\geq (n/2)^b (n+a)b(n/2)b,所以存在 c = ( 1 / 2 ) b c=(1/2)^b c=(1/2)b n 0 = 2 ∣ a ∣ n_0=2|a| n0=2a,当 n ≥ n 0 n\geq n_0 nn0时,有 0 ≤ c ( n b ) ≤ ( n + a ) b 0\leq c(n^b)\leq (n+a)^b 0c(nb)(n+a)b,所以 ( n + a ) b = Ω ( n b ) (n+a)^b=\Omega(n^b) (n+a)b=Ω(nb)

所以 ( n + a ) b = Θ ( n b ) (n+a)^b=\Theta(n^b) (n+a)b=Θ(nb)

图4

因为形容一个算法的运行时间是 O ( n 2 ) O(n^2) O(n2),也就意味着在 n ≥ 某 个 n 0 n\geq 某个n_0 nn0时,该算法在[ 0 , c n 2 0,cn^2 0cn2]的范围内,所以也就是用 O O O记号来形容一个算法的运行时间时,蕴涵着的是该算法的最坏情况运行时间,而至少的意思是该算法的最好情况运行时间,二者是相冲突的。

图5

2 n + 1 = 2 ∗ 2 n 2^n+1=2*2^n 2n+1=22n,所以 2 n + 1 = Θ ( 2 n ) 2^n+1=\Theta(2^n) 2n+1=Θ(2n),所以 2 n = O ( n 2 ) 2^n=O(n^2) 2n=O(n2)
2 2 n = 2 n ∗ 2 n 2^{2n}=2^n*2^n 22n=2n2n,可以看到并没有常数 c c c可以使 2 2 n ≤ c ∗ 2 n 2^{2n}\leq c*2^n 22nc2n
图6

定理3.1

因为 f ( n ) = Θ ( g ( n ) ) f(n)=\Theta(g(n)) f(n)=Θ(g(n)),所以存在正常量 c 1 , c 2 , n 0 c_1,c_2,n_0 c1,c2,n0,使得对所有 n ≥ n 0 n\geq n_0 nn0,有 0 ≤ c 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) 0 \leq c_1g(n) \leq f(n) \leq c_2g(n) 0c1g(n)f(n)c2g(n),那么有正常量 c 2 , n 0 c_2,n_0 c2,n0,使得对所有 n ≥ n 0 n\geq n_0 nn0,有 0 ≤ f ( n ) ≤ c 2 g ( n ) 0 \leq f(n) \leq c_2g(n) 0f(n)c2g(n);有正常量 c 1 , n 0 c_1,n_0 c1,n0,使得对所有 n ≥ n 0 n\geq n_0 nn0,有 0 ≤ c 1 g ( n ) ≤ f ( n ) 0 \leq c_1g(n) \leq f(n) 0c1g(n)f(n)

因为 f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n)=O(g(n)) f ( n ) = Ω ( g ( n ) ) f(n)=\Omega(g(n)) f(n)=Ω(g(n)),所以存在正常量 c 2 , n 1 c_2,n_1 c2,n1,使得对所有 n ≥ n 1 n\geq n_1 nn1,有 0 ≤ f ( n ) ≤ c 2 g ( n ) 0 \leq f(n) \leq c_2g(n) 0f(n)c2g(n);存在正常量 c 1 , n 2 c_1,n_2 c1,n2,使得对所有 n ≥ n 2 n\geq n_2 nn2,有 0 ≤ c 1 g ( n ) ≤ f ( n ) 0 \leq c_1g(n) \leq f(n) 0c1g(n)f(n)。那么就有正常量 c 1 , c 2 , n 0 c_1,c_2,n_0 c1,c2,n0,其中 n 0 = m a x ( n 1 , n 2 ) n_0=max(n_1,n_2) n0=max(n1,n2),使得对所有 n ≥ n 0 n\geq n_0 nn0,有 0 ≤ c 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) 0 \leq c_1g(n) \leq f(n) \leq c_2g(n) 0c1g(n)f(n)c2g(n)
图7

略。

图8

如果 o ( g ( n ) ) ∩ ω ( g ( n ) ) o(g(n))\cap \omega(g(n)) o(g(n))ω(g(n)),则存在 f ( n ) = o ( g ( n ) ) 且 f ( n ) = ω ( g ( n ) ) f(n)=o(g(n))且f(n)=\omega(g(n)) f(n)=o(g(n))f(n)=ω(g(n)),所以有:
0 = lim ⁡ n → ∞ f ( n ) g ( n ) = ∞ 0=\lim_{n \to \infty} \frac {f(n)}{g(n)} = \infty 0=nlimg(n)f(n)=
所以 o ( g ( n ) ) ∩ ω ( g ( n ) ) o(g(n))\cap \omega(g(n)) o(g(n))ω(g(n))空集。
图9

略。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值