【发布时间】: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