【问题标题】:Why can't we use O-Notation to compare algorithms?为什么我们不能使用 O-Notation 来比较算法?
【发布时间】:2014-09-21 22:56:02
【问题描述】:

来自我的教科书:

O-notation 和算法的复杂性

重要的是不要尝试在算法之间进行比较 使用 O 表示法。

例如,假设算法 A1 和 A2 都解决相同的问题 问题,A1的复杂度为O(n^3),A2的复杂度为O(n^2)。

以上说法完全合理。

请注意,我们不能断定 A2 比 A1 更有效 这种情况!

为什么不呢? A2 的复杂度增长比 A1 慢。

【问题讨论】:

  • 在列出的示例中,所有 Big-O 表示法都告诉您,在 某个点,A1 的增长速度快于 A2,因此 A2 是更好的选择。它不会告诉你那一点是什么时候。当您不考虑这一点时,比较就会成为问题。有一些算法的 O 非常大,但隐藏的常数非常高,以至于除了最可笑的大问题之外,这些算法在实践中都不实用。
  • 在第一个引用的“comparisons”之前插入“general”或“sweeping”可能会有所帮助句子。

标签: algorithm performance complexity-theory notation


【解决方案1】:

增长慢并不意味着绝对快。

你有没有这样的经历,你的朋友在你年轻的时候比你高,但你最终成为了你们两个之间更高的人,或者相反?

意思是一样的。 A1 可能更适合和快速解决小规模问题。遇到大问题时它会变慢。

如果您想了解更多有关数学背景的详细信息,强烈推荐 Robert Sedgewick 的“算法分析简介”。

【讨论】:

    【解决方案2】:

    首先,正如 Mark Harrison 所指出的,存在未指定的常数因子。

    其次,这些是上限。对于每个 a>0,Log n 为 O(n^a)。可能是 O(n^3) 算法实际上在每种情况下都比 O(n^2) 算法更快,O(n^3) 并不是最好的界限。如果要指定下限,请使用 omega 或 theta 表示法。

    第三,算法复杂度通常是对最坏情况性能的估计。您可能对平均性能或其他一些衡量标准感兴趣。


    有些人走得太远了,可能是出于对No Free Lunch Theorem 的误解,并声称没有算法比其他算法更好。正如常识所表明的那样,在您选择的任何情况下,某些算法都比其他算法更好。如果您了解上述注意事项,那么计算复杂度界限可以很好地暗示当 n 很大时哪些算法是有效的或实用的。

    【讨论】:

      【解决方案3】:

      big-O 表示法中隐含了一个(未指定的)常量值。所以你实际上被问到哪一个更有效:

      A1 = O(n^3) * n*K1
      A2 = O(n^2) * n*K2
      

      如果不知道 K1 和 K2 的值,就不可能说出 A1 和 A2 的确切运行时间。我们知道 A1 的曲线最终会大于 A2 的曲线,但我们不知道 n 的值是多少。

      可能需要考虑 A1 和 A2 的潜在恒定设置时间。

      A1 = O(n^3) * n*K1 + C1
      A2 = O(n^2) * n*K2 + C2
      

      【讨论】:

      • O(n^3) 包括 a*n^3 + b*n^2 + c*n + d 用于任何 a、b、c、d。这不仅仅是线性加法。 (它还可能包括log n 术语和许多其他内容,但a(内部循环时间)通常是最重要的。)
      • 如果您添加短语“随着 n 无限增长”或“随着 n 接近无穷大”,您是正确的。关键在于,对于较小的 n 值,复杂度较高但设置和每次操作时间较短的算法可能会更有效。
      猜你喜欢
      • 2016-11-02
      • 2014-03-13
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2010-12-25
      • 2023-02-08
      • 1970-01-01
      • 2019-10-24
      相关资源
      最近更新 更多