相同功能的几个大O符号

时间:2013-08-28 11:44:17

标签: algorithm complexity-theory

f(n)= ( (n^2+2n)/n + 1/1000*(n^(3/2)))*log(n)

此功能的时间复杂度可以是O(n²*log(n)) and O(n^(3/2)*log(n))

这怎么可能?我认为这里占主导地位的术语是n² (*log(n))因此它应该是O(n²*log(n))只有大的 O 符号和时间复杂度指标感觉如此模糊

2 个答案:

答案 0 :(得分:6)

Big O符号并不令人困惑。它定义了算法运行时间的上限,因此,如果O(f(n))是一个有效的上限,则每隔一个O(g(n))使g(n) > f(n)明确有效,因为如果你的代码将是运行时间少于f(n),肯定会少于g(n)

在你的情况下,由于O(n^2 *log(n))支配O(n^(3/2) log(n)),它也是一个有效的上限,即使它不那么严格。此外,您可以说您的算法是O(n^3)。问题是,哪一个Big O符号为我们提供了有关该算法的更多信息?显而易见的答案是较低的答案,这就是我们通常表明的原因。

让事情变得简单:让我们说你可以在空中投球10米。然后,你可以说你不能超过10米,或者你可以说你不能超过15米。事实上,第一个是更严格的上限,不会使第二个成为错误的陈述。

答案 1 :(得分:3)

在总和上应用的“ Big O表示法”总是只留下显性(最大)条款。在一个独立变量的情况下,一个术语仅存活。在你的情况下

  O(n^2*log(n) + n^(3/2)*log(n)) = O(n^2*log(n))

因为第一项比第二项大:

  lim(term1/term2) = lim(n^2*log(n) / (n^(3/2)*log(n))) = lim(n^(1/2)) = inf

但似乎你在计算中发现了 arithemic error

  (n^2+2n)/n = n + 2, not n^2 + 2 * n

在那种情况下

  O(n*log(n) + 2*log(n) + n^(3/2)*log(n))

最后一个术语是“n ^(3/2)* log(n)”是最大的一个

  O(n*log(n) + 2*log(n) + n^(3/2)*log(n)) = O(n^(3/2)*log(n))