【问题标题】:Why to ignore the constants in computing the running time complexity of an Algorithm为什么在计算算法的运行时间复杂度时忽略常数
【发布时间】:2011-06-05 10:43:14
【问题描述】:

有人能解释一下在计算算法的运行时间复杂度时忽略常量的原因吗?

谢谢

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    因为在比较非常大的值时,(我们称它为 n)...对于任何 k,n^2 将高于 k*n,其中 n-> 无穷大。 这当然适用于 n 的任何幂/指数。

    请注意,在现实生活中的项目中,您确实会进行这些优化并尝试最小化常数,但通常它们不如多项式的次数那么重要

    【讨论】:

      【解决方案2】:

      在分析时间复杂度常数时,计算起来既困难又不相关。

      在某些架构上,加法可能需要两倍于乘​​法的时间,所以现在我们必须通过算法并计算我们进行的加法次数和乘法次数,以便获得准确的运行时分析。不漂亮!

      更重要的是,即使现在是这样,在未来的某个时间点,或者在另一个稍微不同的架构上,这个常量可能会有所不同,因此运行时会因架构而异。所以现在我的算法有不止一个运行时间?一个现在在这个架构上,另一个在另一个架构上,每个都可能在未来发生变化......再次,不漂亮。

      在一个计算能力一直在变化的世界里,明天 CPU 能力翻倍,一周内存翻四倍,等等。与恒定因素几乎没有相关性。如果我们需要量化实际运行时,情况并非如此,但当我们分析一般算法的复杂性时,情况并非如此。具体环境中解决方案的复杂性。

      此外,也许最重要的是,常数因素并不是衡量问题复杂性的好方法,最终我们正在尝试衡量复杂性。具有特定复杂性类别的算法对于所有大小的输入都以某种方式表现(或更准确地说,是有界的)。因此,当我尝试测量两种解决方案的一般复杂性时,我会以尽可能一般的方式进行测量,因此尝试考虑输入大小的所有值(即 n->infinity)。

      最后,它允许理论家将算法归为同一类,而不管某些可能会或可能不会改变以及可能会或可能不会改进的常数因素。除其他原因外,这有助于最优性证明;发现问题是omega(f(n)) 仅在我们考虑O(f(n)) 的复杂性类中的算法时才有用,而与常量无关。

      【讨论】:

      • 我真的不同意这里。 “隐藏常量”准确地是允许比较同一类的算法。 “不管常数如何”,你都不能认真研究算法。
      • @Sam,请仔细阅读我写的内容,我并不是说这种比较是没有用的,只是它在一般算法分析中的相关性要小得多,即完全脱离了实现细节。确实,当您处理实现时,这很重要,但这听起来不像 OP 所描述的情况。虽然欢迎你不同意我的观点。
      • 我几乎同意这里的一切,除了常量是“不相关”的断言。从典型程序员的角度来看,它们是高度相关的——只是(正如你所说)没有办法在架构中以一致的方式处理它们。如果有人想将自己限制在添加成本 x 和内存访问成本 y 等的特定架构中,那么完全可以根据这些数量准确地说明运行时间。请注意,例如不同的主板或编译器版本可能会改变表达式。
      • @j_random,叹息。为什么大家都误解我?我从来没有说过它们无关紧要。我说过它们在分析算法复杂度时是无关紧要的。我写道(显然不够清楚)在实施情况下,它们相关的......
      • 我认为 OP 对“时间复杂度”一词只有模糊的理解,而在您的第一句话中,您是在正式意义上使用它。如果您考虑一下“分析时间复杂度”可能对他/她意味着什么,可能会更清楚为什么说常量与“分析时间复杂度”“无关”是令人困惑/无益的。
      【解决方案3】:

      在进行粗略估计时,您只会忽略常量。大多数情况下,这是一种有效的简化:当比较两种算法以处理较大的输入维度时,例如对数组进行排序,无论如何,O(n log n) 最终都会比 O(n²) 更快或更小。

      但是,当两种算法具有相同的复杂度,或者当预期的数据集太小以至于渐近行为不是一个有效的现实世界场景时,那么常数肯定很重要。例如,冒泡排序实现可能比快速排序在 3 或 4 个值的数组上执行得更快。

      【讨论】:

        【解决方案4】:

        随着等式 6n^2 + 100n + 300 中 n 值的增长,常数变得不那么相关,我们倾向于忽略它。见下图

        图片取自可汗学院Asymptotic Notation 部分。

        【讨论】:

          猜你喜欢
          • 2011-06-21
          • 1970-01-01
          • 2021-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-09
          • 2018-10-15
          • 1970-01-01
          相关资源
          最近更新 更多