【问题标题】:When do we have to consider the constants in running time我们什么时候必须考虑运行时间中的常数
【发布时间】:2017-02-21 20:03:31
【问题描述】:

假设我有两个算法A()B(),这样算法A() 正好采用O(3n^2) 而算法B() 采用O(n^2)。虽然这两种算法都在二次时间运行,但我们可以说算法 B 运行得更快吗?

我知道我们在分析算法的运行时间时会忽略常量,但我想问一下我们在分析算法时需要考虑常量的情况。

谢谢

【问题讨论】:

  • “正好 O(3n^2)”,也许您的意思是“正好 3n^2 步(在我们感兴趣的特定类型计算机上使用特定实现)”?如果在这台计算机上运行的已实现程序的每一步都花费相同的时间(例如,因为每一步都属于同一类型),那么对于 n >= 1,3n^2 步算法将总是比 n 慢^2 步算法在这台计算机上使用这些实现。但其中许多假设在实践中都失败了:例如,一个算法通常需要“比较”步骤和“交换”步骤,而这可能需要不同的时间。
  • 在几乎任何现代计算机上,即使是相同基本“类型”的步骤也可能花费不同的时间——例如,“将这个字节复制到那个字节”步骤会更快,如果它的一些操作数恰好在缓存中。您可以在模型中包含这样的细节,也可以不包含;如果这样做,您将获得更准确 的结论(在与模型紧密匹配的计算机上),但不太一般 结论(它们不适用于其他模型)。 Big-O 最坏情况界限接近最普遍的范围:给定足够大的输入,它们可以为 任何 计算机给出正确的结论。

标签: algorithm performance asymptotic-complexity


【解决方案1】:

您可能想看看this SO answer

从那个答案:

总而言之 - 由于 big-O 只讨论相对类别的增长率,它忽略了常数因素。然而,这些常数是绝对重要的。它们只是与渐近分析无关。

所以它在大 O 表示法方面可能没有什么不同,但在现实生活中,你的算法 B 确实会运行得更快。

【讨论】:

  • 你现在给我带来了一些东西,当我已经知道我的算法的输入大小会非常大时,你认为我们应该考虑常量吗?
  • 我认为如果你在 Cn 或 Gn^2 之间做出选择(其中 G 和 C 是常数,G 远小于 C)你应该忽略常数并关注它是指数还是线性。相反,如果您有两种算法以相同的速度增长(忽略常量)的情况(如您的示例),那么您应该考虑您的常量。
  • np。也只是为了澄清一下:我之前的评论是有效的,假设一个无限大的数据集,但是如果你知道你的数据集有多大,你可以估计 Cn 可能比 G快>n^2 但你需要记住的是,有一个点会交叉,超过这个点你的线性算法会做得更好
  • 因此,如果您正在寻找可扩展的东西(即使您现在知道数据集的大小),我最初的评论就是您应该查看的内容
  • 这个链接真的很有帮助..感谢你的努力
【解决方案2】:

您的两种算法具有相同的渐近复杂度,但其中一种肯定比另一种更快。

在这种情况下,A 有一个更大的常数,因此它可能会更慢,但可能还有其他因素在起作用(例如算法实现和运行它的硬件中的实现细节)可能会影响无论哪种方式的平衡。

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 2014-11-08
    • 2013-10-23
    • 2011-01-22
    • 2011-03-17
    • 2011-03-18
    • 2012-04-26
    相关资源
    最近更新 更多