O,Ω和Θ之间有什么区别?

时间:2009-12-25 03:47:12

标签: algorithm big-o time-complexity

我正在学习算法分析。我无法理解O,Ω和Θ之间的差异。

他们的定义方式如下:

  
      
  • f(n) = O(g(n))表示c · g(n)是一个   f(n)上限。因此存在   一些常数cf(n)   总是≤c · g(n),足够大n   (即n ≥ n0代表某个常数n0)。
  •   
  • f(n) = Ω(g(n))表示c · g(n)是一个   f(n)的下限。因此存在   一些常数cf(n)   对于所有c · g(n),始终≥n ≥ n0
  •   
  • f(n) = Θ(g(n))表示c1 · g(n)f(n)的上限,而c2 · g(n)是   所有f(n)的{​​{1}}下限。   因此存在常量n ≥ n0c1   这样c2f(n) ≤ c1 ·g(n)。这意味着f(n) ≥ c2 ·g(n)   在g(n)上提供了一个很好的紧密界限。
  •   

我理解这一点的方式是:

  • f(n)给出了给定函数/算法的最坏情况复杂性。
  • O(f(n))给出了给定函数/算法的最佳案例复杂性。
  • Ω(f(n))给出了给定函数/算法的平均大小写复杂度。

如果我错了,请纠正我。如果是这种情况,则必须以所有三种符号表示每种算法的时间复杂度。但我观察到它表示为O,Ω或Θ;为什么不是全部三个?

6 个答案:

答案 0 :(得分:36)

重要的是要记住,符号,无论是O,Ω还是Θ,表达函数的渐近增长;它与算法本身没有任何内在联系本身。问题中的函数可能是算法的“复杂性”(运行时间),无论是最坏情况,最佳情况还是平均情况,但符号与函数的来源无关。

例如,函数f(n)= 3n 2 +5是:

  • O(n 2 ),它也是O(n 2 log n),O(n 3 ),O(n 4 )等等,但不是O(n)。
  • Ω(n 2 ),它也是Ω(n log n),Ω(n)等,但不是Ω(n 3 )。
  • Θ(N 2 )。它甚至不是Θ(n 2 log n)或Θ(n 2 / log n)。

现在,通常所考虑的函数是算法的最坏情况复杂性,并且使用三者的符号取决于我们想要说什么以及我们如何仔细地进行分析。例如,我们可能会观察到,因为有两个嵌套循环,最坏情况下的运行时间最多 O(n 2 ),而不关心这是否真的实现了一些投入。 (通常很明显它是。)或者,我们可以说排序的最坏情况运行时间是Ω(n log n),因为必须有一些输入,它必须至少需要cn(log n)脚步。或者,我们可以查看一个特定的mergesort算法,并且看到在最坏情况中最多需要O(n log n)个步骤,一些输入使得它需要n个log步骤,所以最坏情况下的运行时间是Θ(n log n)。

请注意,在上面的所有三个示例中,正在分析的运行时间仍然相同(最坏情况)。我们可能会分析最佳案例或平均案例,但同样,我们使用的三种符号取决于我们想说的内容 - 我们是否想要给出上限,下限或紧密限制增长相同的功能

答案 1 :(得分:34)

Θ表示渐近紧上限和下限。

O表示上限,但此界限可能会或可能不紧 o表示不紧的上限。

Ω表示下限,但此界限可能会或可能不紧 ω表示不紧的下限。

答案 2 :(得分:6)

这些资源将真正帮助您:

答案 3 :(得分:6)

对于这三者的意思,请参阅CanBerkGüder的答案。

另请注意,他们对最佳案例,最坏情况和普通案件一无所知。例如,冒泡排序是Θ(n)最佳情况(因为如果数据已经排序,则仅需要进行n-1次比较),以及Θ(n ^ 2)最坏情况。假设随机混洗输入,它是Θ(n ^ 2)平均情况。因此,该平均情况也是O(n ^ 2),O(n ^ 3)和O(2 ^ n)。

所以,O,Θ和Ω告诉你它是什么类型的约束。他们没有告诉你限制是什么。在上下文中,它可能是对最佳案例,更糟糕案例,平均案例或整个算法(所有案例)的限制。

当然,如果算法具有Ω(g)最佳情况,那么它本身就是Ω(g)。如果它具有O(g)最坏情况,则为O(g)。所以那里有一种关系。但如果它有Θ(g)的平均情况,那几乎没有告诉你最好和最坏的情况。

至于“为什么不是这三个人?”。

如果函数是Θ(g),那么它也是O(g)和Ω(g)。因此,在Θ范围内提供其他边界并没有多大意义。

当你单独看到其中一个时,通常是因为我们只关心上限,或者我们只关心下限。所以我们说所有比较排序必然是Ω(n log n)最坏的情况,并且冒泡排序是O(n ^ 2)最坏情况但是O(n)最好的情况,因为我们不是试图完全描述时间复杂性,我们只是在特定的语境中表达我们关心的界限。

无论如何,大多数人似乎都很懒,并且不想输入希腊字母。我知道我是。所以我们只是说比较分类“至多是O(n log n)”。这真的是对符号的滥用,但它得到了重点。

答案 4 :(得分:0)

Big-O表示法通常被称为算法的复杂性,因为它向我们保证,对于大n,算法不会表现得更差。然而,正如前面正确指出的那样,Big-O为我们提供渐近评估,并且当给定某些输入时,我们的算法可能表现不同。例如,当数组已经排序时,快速排序可以是O(n ^ 2)。 OTOH,在实践中可以通过简洁的实现来改进渐近的情况。

答案 5 :(得分:0)

最佳情况用Ω(n)表示法表示。 最坏的情况用Ο(n)表示法表示。 平均大小写用Θ(n)表示。