【问题标题】:What is the difference between O, Ω, and Θ?O、Ω 和 Θ 有什么区别?
【发布时间】:2010-12-29 22:42:50
【问题描述】:

我正在学习算法分析。我无法理解 O、Ω 和 Θ 之间的区别。

它们的定义方式如下:

  • f(n) = O(g(n)) 表示 c · g(n) 是一个 f(n) 的上限。因此存在 一些常数 c 使得 f(n) 是 总是≤c · g(n),对于足够大的n (例如,n ≥ n0 表示某些常量 n0)。
  • f(n) = Ω(g(n)) 表示 c · g(n) 是一个 f(n) 的下限。因此存在 一些常量c 使得f(n) 是 对于所有n ≥ n0,始终≥c · g(n)
  • f(n) = Θ(g(n)) 表示 c1 · g(n)f(n) 的上限,c2 · g(n)f(n) 的下限,适用于所有 n ≥ n0。 因此存在常量c1c2 这样f(n) ≤ c1 ·g(n)f(n) ≥ c2 ·g(n)。这意味着g(n)f(n) 上提供了一个很好的、紧密的界限。

我的理解是这样的:

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

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

【问题讨论】:

  • 那么,这些答案对您有帮助还是让您更加困惑?这里有一些很好的信息,但我认为当你问这个问题时你有一个特定的目的。如果你能弄清楚你在做什么,那么应该有人可以提供进一步的帮助。
  • 实际上我正在阅读算法书。在示例中,算法的分析时间复杂度为 O、Ω 和 Θ。所以我只是想确保在继续之前我理解了它。现在它似乎更清楚了......谢谢

标签: algorithm big-o time-complexity


【解决方案1】:

最佳情况用 Ω(n) 表示法表示。 最坏情况由Ο(n) 表示法表示。 平均情况用 Θ(n) 表示法表示。

【讨论】:

    【解决方案2】:

    关于这三个的含义,请参阅 Can Berk Gü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)”。这确实是对符号的滥用,但它明白了重点。

    【讨论】:

    • 其他定义也可以,正在使用中。我们通常有很好的函数 g(实际上我们只需要正数),所以我们总是可以通过选择一个更大的常数 c 来解释前几个 M(无限多)。
    • 是的,但完整的定义说明了未在任何地方定义的函数,以及实数函数,而不仅仅是整数。例如,根据正确的定义,1/x 是 O(1),1/(x-1)、1/((x-1)*(x-2)) 等也是如此,无需特殊条件考虑到他们有限的领域。我想如果您不是数学家,则根据“我的意思很明显”的原则,定义等同于同一件事;-)。但是无穷大的渐近极限(我的定义)和普通的极限(你的定义)是有区别的,区别在于与 M 的业务。
    • 哦,是的,我已经提到的另一个极端情况是 f(n) = n + 1, g(n) = n^2。那么 f 是 O(g),即使显然没有 ac 使得 n + 1
    • 好点:“足够大的 N”定义 限制较少......只要很明显,这两个定义都是相同的。 :-)(例如,对于离散域,从 n≥1 开始,g 为正值等)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      Θ 表示一个渐近紧的上限和下限。

      O 表示一个上限,但这个界限可能很紧,也可能不紧。
      o 表示不严格的上限。

      Ω 表示一个下限,但这个界限可能很紧,也可能不紧。
      ω 表示不紧的下界。

      【讨论】:

        【解决方案5】:

        重要的是要记住,符号,无论是 O、Ω 还是 Θ,都表示函数的渐近增长;它在本质上与算法本身没有任何关系。所讨论的函数可能是算法的“复杂性”(运行时间),可以是最坏情况、最好情况或平均情况,但符号与函数的来源无关。

        例如函数f(n)=3n2+5为:

        • O(n2),也是O(n2log n),O(n3),O(n 4) 等等,但不是 O(n)。
        • Ω(n2),也是Ω(n log n)、Ω(n)等,但不是Ω(n3)。
        • Θ(n2)。它甚至不是 Θ(n2log n) 或 Θ(n2/log n)。

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

        请注意,在上述所有三个示例中,所分析的运行时间仍然相同(最坏情况)。我们可以改为分析最佳情况或平均情况,但同样,我们使用三种表示法中的哪一种取决于我们想说什么——我们是否要给出一个上限、下限或严格的界限同样的功能的增长。

        【讨论】:

        • 当他们说算法的最佳情况成本是 O(n^2) 而最坏情况成本是 Ω(n^3) 是什么意思?
        • @Akshay:对于给定的算法,我们可以考虑不同输入的运行时间。说它的最佳情况成本是 O(n^2) 意味着在所有输入中,对于某些输入(“最佳情况”),该输入所花费的时间是 O(n^2) 的某个函数(例如10n^2+20 或 nlogn+5 或 3n+1)。因此,您已经证明了在最佳情况下需要多少时间的上限。类似地,说它的最坏情况是 Ω(n^3) 意味着对于某些输入(最坏情况),它所花费的时间是某个函数,即 Ω(n^3)(如 0.5n^3 + 3,或15n^4)。所以我们给出了最坏情况时间的下限
        【解决方案6】:

        以下是一些对您真正有帮助的资源:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-12
          • 2018-01-20
          • 1970-01-01
          • 2013-05-07
          • 2015-07-23
          • 2010-11-12
          • 2013-04-26
          • 2011-05-22
          相关资源
          最近更新 更多