让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 符号和时间复杂度指标感觉如此模糊
答案 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)
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))