是否(log(n * log n)可以认为是O(log n)

时间:2013-09-16 02:59:23

标签: big-o asymptotic-complexity

考虑我得到f(n)= log(n * log n)。我应该说它的O(log(n * log n)? 或者我应该记录log(n * log n)= log n + log(log n)然后说函数f(n)是O(log n)?

3 个答案:

答案 0 :(得分:1)

首先,正如您所观察到的那样:

 log(n*log n) = log(n)  + log(log(n))

但将log(log N)视为N->大(如Floris建议的那样)。

例如,设N = 1000,则log N = 3(即小数),log(3)甚至更小, 这就像N变得庞大一样,即比你的代码可能生成的指令数多。

因此,O(log(n * log n))= O(log n + k)= O(log(n))+ k = O(log n)

另一种看待这种情况的方法是:n * log n<< n ^ 2,所以在更糟糕的情况下:

  O(log(n^2)) > O(log(n * log n))

因此,2 * O(log(n))是上限,O(log(n * log n))= O(log n)

答案 1 :(得分:0)

使用definition。如果f(n)= O(log(n * log(n))),则必须存在正常数M和实数n 0 ,以便:

  

| F(N)| ≤M| log(n * log(n))|

对于所有n&gt; Ñ<子> 0

现在让我们假设(不失一般性)n 0 &gt;那么

  

log(n)≥log(log(n))

对于所有n&gt; Ñ<子> 0

由此,我们有:

  

log(n(log(n))= log(n)+ log(log(n))≤2* log(n)

代替,我们发现

  

| F(N)| ≤2* M | log(n))|对于所有n&gt; Ñ<子> 0

由于2 * M也是正常数,因此紧跟f(n)= O(log(n))。

答案 2 :(得分:0)

当然,在这种情况下,简单转换显示两个函数的渐近因子不等,如图所示。

然而,我觉得值得提醒一个经典的测试来分析两个函数如何渐近地相互关联。所以这是一个更正式的证据。

您可以在f(x)时分析g(x)来查看lim f(x)/g(x)x->infinity的关系。

有3例:

  1. lim = infinty&lt; =&gt; O(f(x))&gt; O(g(x))
  2. inf&gt; lim &gt; 0&lt; =&gt; O(f(x)) = O(g(x))
  3. lim = 0&lt; =&gt; O(f(x))&lt; O(g(x))
  4. 所以

    lim ( log( n * log(n) ) / log n ) =
    lim ( log n + log log (n) )  / log n =
    lim 1 + log log (n) / log n =
    1 + 0 = 1
    

    注意:我认为log log n / log n是微不足道的,但您可以de l'Hospital Rule完成。