Algorithm 为什么我们不能用O表示法来比较算法?

Algorithm 为什么我们不能用O表示法来比较算法?,algorithm,performance,complexity-theory,notation,Algorithm,Performance,Complexity Theory,Notation,从我的课本上: O-表示法与算法复杂性 重要的是不要试图在算法之间进行比较 使用O表示法 例如,假设算法A1和A2都解决相同的问题 问题,A1在^3上具有复杂性,A2在^2上具有复杂性 上述说法完全合理 观察到,我们不能得出结论,A2比A1更有效 这种情况 为什么不呢?A2的复杂性增长慢于A1。增长慢并不意味着绝对快 你是否有过这样的经历:当你年轻时,你的朋友比你高,但最终你会成为你们之间的高个子,或者反过来 意思是一样的。A1可能更适合解决小规模问题,速度更快。当遇到大问题时,它只会变得更慢

从我的课本上:

O-表示法与算法复杂性

重要的是不要试图在算法之间进行比较 使用O表示法

例如,假设算法A1和A2都解决相同的问题 问题,A1在^3上具有复杂性,A2在^2上具有复杂性

上述说法完全合理

观察到,我们不能得出结论,A2比A1更有效 这种情况


为什么不呢?A2的复杂性增长慢于A1。

增长慢并不意味着绝对快

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

意思是一样的。A1可能更适合解决小规模问题,速度更快。当遇到大问题时,它只会变得更慢


如果你想知道更多关于数学背景的细节,那么强烈推荐罗伯特·塞吉威克(Robert Sedgewick)对算法分析的介绍。

增长较慢并不意味着绝对更快

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

意思是一样的。A1可能更适合解决小规模问题,速度更快。当遇到大问题时,它只会变得更慢


如果你想知道更多关于数学背景的细节,那么强烈推荐罗伯特·塞吉威克(Robert Sedgewick)的算法分析简介。

大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

在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

首先,正如马克·哈里森所指出的,有一些未指明的常量因素

其次,这些是上界。对于每个a>0,日志n都在^a上。可能是在每种情况下,On^3算法实际上都比On^2算法快,On^3算法并不是最好的边界。如果要指定下限,请使用或θ表示法

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


有些人走得太远了,也许是出于对算法的误解,他们说没有比其他算法更好的算法。正如常识所表明的,在您选择的任何上下文中,某些算法都比其他算法好。如果您理解上述注意事项,计算复杂度界限可能是一个很大的提示,表明当n较大时,哪些算法是有效的或可行的。

首先,正如Mark Harrison指出的,有一些未指定的常数因子

其次,这些是上界。对于每个a>0,日志n都在^a上。可能是在每种情况下,On^3算法实际上都比On^2算法快,On^3算法并不是最好的边界。如果要指定下限,请使用或θ表示法

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


有些人走得太远了,也许是出于对算法的误解,他们说没有比其他算法更好的算法。正如常识所表明的,在您选择的任何上下文中,某些算法都比其他算法好。如果您理解上述注意事项,那么计算复杂度边界可能是一个很大的提示,表明当n较大时,哪些算法是有效的或可行的。

On^3包括a*n^3+b*n^2+c*n+d用于任何a、b、c、d。这不仅仅是一个线性加法。它也可能包括对数n项和许多其他内容,但a内环时间通常是最重要的。如果你在n无限增长或n接近无穷大时添加短语,你是正确的。关键的一点是,对于较小的n值,具有更高复杂性但设置和每次操作时间较低的算法可能更有效。对于任何a、b、c、d,On^3包括a*n^3+b*n^2+c*n+d。这不仅仅是一个线性加法。它还可以包括logn术语和lot
s是其他的东西,但是a内环时间通常是最重要的。如果在n无限增长或n接近无穷大时添加短语,则是正确的。关键的一点是,对于较小的n值,复杂度较高但设置和每次操作时间较低的算法可能更有效。在所列示例中,所有大O表示法都告诉您,在某个点A1的增长速度比A2快,因此A2是更好的选择。它不会告诉你那一点是什么时候。当你没有考虑到这一点时,比较就会成为一个问题。有一些算法的O值特别大,但隐藏常数太高,使得算法在实践中除了最可笑的大问题之外都不切实际。这可能有助于在第一句引用的句子中插入比较前的一般或全面。在所列示例中,所有大O符号告诉你的是,在某一点上A1的增长速度比A2快,这使得A2成为更好的选择。它不会告诉你那一点是什么时候。当你没有考虑到这一点时,比较就会成为一个问题。有一些算法的O值特别大,但隐藏常数太高,使得算法在实践中除了最可笑的大问题之外,对所有问题都不切实际。在第一句引用的句子中插入比较前的一般或全面可能会有所帮助。