【问题标题】:Asymptotic behavior of algorithms and Big O comparison [duplicate]算法的渐近行为和大 O 比较 [重复]
【发布时间】:2018-06-14 12:22:32
【问题描述】:

在特定情况下,我对大 O 表示法和算法的渐近行为感到有些困惑。当我阅读博客http://discrete.gr/complexity/ 很好地描述了这些符号时,我发现了这个说法,不管它是真是假:

一个 O( n ) 算法是 Θ( 1 )

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

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

谁能举例说明?

【问题讨论】:

  • 1 ∈ O(1), 1 ∈ O(n), 1 ∈ Θ(1), n ∈ O(n), n ∈ Θ(n), n ∉ Θ(1)。非常非正式(不考虑常数因素),Theta 相等,Big-O 小于或等于 -
  • @Dukeling:很好的评论。请注意,链接副本的答案是错误的。即使它有超过 500 个赞:-/

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


【解决方案1】:
  • 如果您知道某项任务恰好需要一周时间 (= Θ(1)),那么您肯定可以说您最多可以在一年内完成 (= O(n))。

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

  • 如果您知道某项任务恰好需要一年 (= Θ(n)),您也可以说它最多需要一年 (= O(n)),并且您确定它不能在周 (≠ Θ(1))。

【讨论】:

    【解决方案2】:

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

    将其与对整数列表求和。在这种情况下,您总是必须只查看列表中的每个项目一次。上限为 O(n),下限为 Ω(n)。没有任何项目的排列会改变算法的复杂性。在这种情况下,当严格的上下界相同时,我们称算法复杂度为 Θ(n)。

    如果一个算法是Θ(n),那么复杂度永远不会超过O(n),也永远不会小于O(n)。所以不可能是 O(1) 或 Θ(1)。

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

    【讨论】:

    • 感谢您提供这些示例。所以据我了解,如果一个算法是用 theta 表示法描述的,那么上限 Big-O 和下限 Omega 很可能是相同的:这意味着该算法的输入不会影响运行时间,相反如果一个算法是用 Big-O 表示法描述的,那么根据算法的输入,它的运行时间可能会有所不同。我的理解正确吗?
    • 如果使用 theta 表示法,则 根据定义,上限和下限相同。不是“最有可能”。如果一个算法被描述为 O(n),没有 omega,那么你所知道的只是上限,实际复杂度可能会随输入而变化。
    【解决方案3】:

    这个例子基本上试图涵盖两个想法:

    1. 如果一个算法是Θ(f(n)),这意味着它既是Ω(f(n))又是O(f(n))。它在渐近上既不比 f(n) 好也不差,它具有相同的渐近行为。
    2. O(1) 的函数可以看作是O(n) 函数的子集。 这可以概括,但这里不需要太正式,我想是为了避免我这边数学上不正确的灾难。这意味着,如果它永远不会比常数差,那么它永远不会比线性函数差。

    所以想法是将 Θ 分解为 O 和 Ω 符号。然后确定哪个是哪个子集。

    还很高兴注意到任何算法(至少具有非空复杂性)都是Ω(1)。算法永远不会比常数做得更好。

    示例哺乳动物是人类。

    答案:不,一般来说不是。不过,所有人都是哺乳动物。人类是哺乳动物的一个子集

    我试着想另一个例子,但它要么技术性太强,要么不够清楚。所以我将把这个画得不太好但相当清晰的图表留在这里。我通过谷歌搜索 o omega theta 并寻找图像找到了。还有其他一些不错的图片。

    基本上,对于图中的每个函数 f:任何高于它的都是 Ω(f(n)),因为它永远不会比 f 做得更好,它永远不会随着 n 的增加而低于它;低于它的任何东西都是 O(f(n)),因为它永远不会比 f 差,它永远不会随着 n 的增加而高于它。

    该图不能很好地显示出渐近常数的不显着性。还有其他图表可以更好地显示它。我把它放在这里是因为它一次有很多功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多