从我的教科书:
O-notation和算法的复杂性
重要的是不要尝试在算法之间进行比较 使用O符号。
例如,假设算法A1和A2都解决了相同的问题 问题是,A1具有复杂度O(n ^ 3),A2具有复杂度O(n ^ 2)。
以上陈述完全合理。
观察我们不能断定A2比A1更有效率 这种情况!
为什么不呢? A2的复杂性比A1慢。
答案 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