为什么我们不能使用O-Notation比较算法?

时间:2014-09-21 22:56:02

标签: algorithm performance complexity-theory notation

从我的教科书:

  

O-notation和算法的复杂性

     

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

     

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

     

以上陈述完全合理。

     

观察我们不能断定A2比A1更有效率   这种情况!

为什么不呢? A2的复杂性比A1慢。

3 个答案:

答案 0 :(得分:3)

生长得慢并不意味着绝对更快。

你有这样的经历,你的朋友比你年轻时高,但你最终成为你们之间的高个子,或者反过来?

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

如果您想了解有关数学背景的更多细节,那么"算法分析简介"由Robert Sedgewick强烈推荐。

答案 1 :(得分:2)

首先,马克哈里森指出,有一些未指明的常数因素。

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

第三,算法复杂度通常是对最坏情况性能的估计。您可能会对平均性能或其他措施感兴趣。


有些人走得太远,可能是出于对No Free Lunch Theorem的误解,并说没有算法比其他算法更好。常识表明,在您选择的任何环境中,某些算法比其他算法更好。如果您了解上述警告,那么当n很大时,计算复杂性界限可能是一个很大的暗示,即哪些算法是有效的或可行的。

答案 2 :(得分:1)

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