算法的渐近行为和Big O比较

时间:2018-01-04 17:51:31

标签: algorithm time-complexity big-o asymptotic-complexity

我对Big O表示法和算法的渐近行为的特定情况有点困惑。当我正在阅读描述这些符号的博客http://discrete.gr/complexity/时,我发现这个陈述是真是假:

O(n)算法是Θ(1)

答案说根据算法,这可能是也可能不是。在一般情况下,这是错误的。如果算法是Θ(1),那么肯定是O(n)。但如果它是O(n)那么它可能不是Θ(1)。例如,Θ(n)算法是O(n)但不是Θ(1)。

我正在努力理解这个答案。我知道Big O意味着程序可以渐近地变得更糟。所以我解释了上面的陈述,其中O(n)比Θ(1)更差并且是真的。

有人可以用一个例子来解释吗?

3 个答案:

答案 0 :(得分:3)

  • 如果您知道任务只需要一周(= Θ(1)),那么您肯定可以说最多可以在一年内完成(= O(n))。

  • 如果您知道任务最多需要一年(= O(n)),则无法确定您是否会在一周内完成此任务(= Θ(1))。

  • 如果您知道任务只需要一年(= Θ(n)),那么您也可以说它最多需要一年(= O(n)),并且您确定它不能在一周内完成(≠ Θ(1))。

答案 1 :(得分:2)

考虑optimized bubble sort,它具有O(n 2 )的渐近紧上界,以及Ω(n)的渐近紧束下界(当数组已经排序时) )。项目的排列决定了算法必须执行的操作数量。

对比整数列表。在这种情况下,您始终只需查看列表中的每个项目一次。上限为O(n),下限为Ω(n)。没有项目的安排会改变算法的复杂性。在这种情况下,当紧上限和下限相同时,我们说算法的复杂度是Θ(n)。

如果算法是Θ(n),那么复杂性将永远不会超过O(n),并且它永远不会小于O(n)。所以它不可能是O(1)或Θ(1)。

但是如果算法被描述为O(n),则可以是Ω(1)。例如,在整数列表中查找第一个非零值。如果列表中的第一项不为零,则您不必查看任何其他数字。但是,如果列表全部为零,则最终会查看所有列表。所以上限是O(n),下限是Ω(1)。

答案 2 :(得分:0)

该示例基本上试图涵盖两个想法:

  1. 如果算法为Θ(f(n)),则表示它同时为Ω(f(n))O(f(n))。它渐近既不比f(n)更好也不差,它具有相同的渐近行为。
  2. O(1)的函数可视为O(n)函数的子集。 这可以概括,但不需要在这里过于正式我想从我身边避免数学上不正确的灾难。这意味着如果它永远不会比常数更糟糕,那么它永远不会比线性函数更糟糕。
  3. 因此,我们的想法是将Θ分解为O和Ω符号。然后确定哪个是哪个子集。

    另外值得注意的是,任何算法(至少具有非零复杂度)都是Ω(1)。算法永远不会比常量做得更好。

    示例哺乳动物是人类。

    答案:不,不是一般的。然而,所有人都是哺乳动物。人类是哺乳动物的子集

    我试着想到另一个例子,但它太技术性或不够清晰。所以我会在这里留下这个不那么精美,但在这里清晰的图表。我通过谷歌搜索o omega theta并寻找图像。还有一些其他好的图像。

    graph

    基本上,对于这个图中的每个函数f:它上面的任何东西都是Ω(f(n)),因为它永远不会比f好,当n增加时它永远不会低于它;低于它的任何东西都是O(f(n)),因为它永远不会比f更糟,当n增加时它永远不会高于它。

    图表没有很好地显示常数渐近的微不足道。还有其他图表更好地显示它。我只是把它放在这里,因为它一次有很多功能。