简单语言中Big-Theta和Big O符号的区别

时间:2012-08-27 08:00:01

标签: algorithm big-o big-theta

在尝试理解 Theta O 符号之间的区别时,我发现了以下声明:

The Theta-notation asymptotically bounds a function from above and below. When
we have only an asymptotic upper bound, we use O-notation.

但我不明白这一点。这本书以数学的方式解释了它,但它太复杂了,当我真的不理解时,阅读起来真的很无聊。

任何人都可以使用简单但功能强大的示例来解释两者之间的区别。

6 个答案:

答案 0 :(得分:40)

Big O只给出上渐近界,而大Theta也给出了下界。

Theta(f(n))的所有内容也是O(f(n)),但不是相反。 如果T(n) Theta(f(n))

,则O(f(n))被称为Omega(f(n))

由于这个原因, big-Theta比big-O 符号更具信息性,所以如果我们可以说一些东西是大-Theta,那通常是首选。然而,证明某些东西是大的Theta比证明它是大O更难。

对于示例merge sort同时为O(n*log(n))Theta(n*log(n)),但它也是O(n 2 ),因为n 2 渐近“大于”。但是,它不是Theta(n 2 ),因为算法不是Omega(n 2 )。


Omega(n)渐近下界。如果T(n)Omega(f(n)),则表示从某个n0开始,C1为常量T(n) >= C1 * f(n)。而大O表示有一个C2常数T(n) <= C2 * f(n))

所有三个(Omega,O,Theta)仅提供渐近信息(“用于大输入”):

  • Big O给出上限
  • Big Omega给出了下限和
  • Big Theta提供下限和上限

请注意,此表示法与算法的最佳,最差和平均案例分析相关。这些中的每一个都可以应用于每个分析。

答案 1 :(得分:8)

我将引用 Knuth的TAOCP第1卷 - 第110页(我有印度版)。我建议阅读第107-110页(第1.2.11节渐近表示

  

人们经常通过假设它给出一个确切的增长顺序来混淆O符号;他们使用它就好像它指定了下限和上限。例如,算法可能被称为低效,因为其运行时间为O(n ^ 2)。但是O(n ^ 2)的运行时间并不一定意味着运行时间也不是O(n)

在第107页,

1 ^ 2 + 2 ^ 2 + 3 ^ 2 + ... + n ^ 2 = O(n ^ 4)和

1 ^ 2 + 2 ^ 2 + 3 ^ 2 + ... + n ^ 2 = O(n ^ 3)和

1 ^ 2 + 2 ^ 2 + 3 ^ 2 + ... + n ^ 2 =(1/3)n ^ 3 + O(n ^ 2)

Big-Oh适用于近似值。它允许你用等号=符号替换〜。在上面的例子中,对于非常大的n,我们可以确定数量将保持在n ^ 4和n ^ 3以及(1/3)n ^ 3 + n ^ 2 [并且不仅仅是n ^ 2]

Big Omega用于下限 - 具有Omega(n ^ 2)的算法不如具有大N的O(N logN)的算法有效。但是,我们不知道N的值是多少(在那个感觉我们大致知道)

Big Theta是针对增长的确切顺序,包括下限和上限。

答案 2 :(得分:5)

这是我的尝试:

函数f(n)O(n),当且仅当存在常量c时才f(n) <= c*g(n)

使用此定义,我们可以说函数f(2^(n+1))O(2^n)吗?

  1. 换句话说,'c'是否存在常数2^(n+1) <= c*(2^n)?注意第二个函数(2^n)是上述问题中Big O之后的函数。起初这让我很困惑。

  2. 因此,请使用您的基本代数技巧来简化该等式。 2^(n+1)分解为2 * 2^n。这样做,我们留下:

    2 * 2^n <= c(2^n)

  3. 现在很简单,该等式适用于c c >= 2的任何值。所以,是的,我们可以说f(2^(n+1))O(2^n)

  4. Big Omega以相同的方式工作,除了它评估f(n) &gt; = c*g(n)一些常量'c'

    因此,以相同的方式简化上述功能,我们留下(请注意&gt; = now):

    2 * 2^n >= c(2^n)

    因此,该等式适用于范围0 <= c <= 2。所以,我们可以说f(2^(n+1))是{Ometesga的(2^n)

    现在,由于那些人持有,我们可以说这个函数是Big Theta(2^n)。如果其中一个不能用'c'的常数,那么它不是大Theta。

    上面的例子来自Skiena的算法设计手册,这是一本很棒的书。

    希望有所帮助。这真的是一个简化的难题。不要过多地关注'c'的内容,只需将其分解为更简单的术语并使用您的基本代数技巧。

答案 3 :(得分:4)

我将用一个例子来说明差异。

将函数f(n)定义为

if n is odd f(n) = n^3
if n is even f(n) = n^2

来自CLRS

  

如果存在正数,则函数f(n)属于集合Θ(g(n))   常数c1和c2使得它可以“夹在”c1g(n)之间   和c2g(n),足够大的n。

  

O(g(n))= {f(n):存在正常数c和n0,使得0≤   对于所有n≥n0},f(n)≤cg(n)。

  

Ω(g(n))= {f(n):存在正常数c和n0,使得0≤   所有n≥n0}的cg(n)≤f(n)。

f(n)的上限是n ^ 3。所以我们的函数f(n)显然是O(n ^ 3)。

但它是Θ(n ^ 3)?

对于f(n)在Θ(n ^ 3)中,它必须夹在两个函数之间,一个形成下界,另一个上界,两者都在n ^ 3处生长。虽然上限是明显的,但下限不能是n ^ 3。下限实际上是n ^ 2; f(n)是Ω(n ^ 2)

来自CLRS

  

对于任何两个函数f(n)和g(n),我们有f(n)=Θ(g(n))if和   只有当f(n)= O(g(n))且f(n)=Ω(g(n))时才有。

因此f(n)不在Θ(n ^ 3),而在O(n ^ 3)和Ω(n ^ 2)

答案 4 :(得分:4)

如果运行时间以big-O表示法表示,则表示运行时间不会比给定表达式慢。它表达了最糟糕的情况。

但是使用Theta符号你也知道它不会更快。也就是说,没有最佳情况下算法会更快地重新调整。

这给出了预期运行时间的更精确限制。然而,对于大多数目的而言,忽略下限(更快执行的可能性)更简单,而您通常只关注最坏情况。

答案 5 :(得分:0)

在非常简单的语言中,差异是这样的:

Big O表示法用于算法的最坏情况分析。 Big Omega用于算法的最佳案例分析。 当最佳情况和最坏情况分析相同时,将Big Theta用于算法分析。

假设您正在使用二进制搜索算法在排序数组中寻找数字。

[1 2 3 4 5 6 7] 

在最坏的情况下,例如目标为1时,它必须执行log(n)拆分检查,在本例中为log(7)。可以表示为O(n)。

在最佳情况下,例如当目标为3时,它仅执行一次操作。可以表示为Ω(1)