loglogN复杂性循环如何?

时间:2015-10-03 12:15:19

标签: algorithm data-structures time-complexity asymptotic-complexity

我这里的问题很少 考虑以下循环(让N = 8)

for(int i=1;i<N/2;i++){

  // this is O(logN)

}

N / 2 = 4 但是 log(8)= 3 (考虑基数为2)那么为什么上面的循环被视为O(logN)

以及O(loglogN)循环如何?

PS:对不起我糟糕的数学概念

3 个答案:

答案 0 :(得分:6)

O(log n)循环:

for (i = 1; i <= n; i *= 2)

所以你在每一步加倍i。基本上是:

  1. 增量=&gt; O(n)
  2. 加倍=&gt; O(log n)
  3. ??? =&GT; O(log log n)
  4. 乘法之后会发生什么?幂。所以这将是O(log log n)

    for (i = 2; i <= n; i *= i) // we are squaring i at each step
    

    注意:您的循环为O(n),而不是O(log n)。与上面的increment / double / exponentiate想法保持一致,您可以使用增量重写循环:

    for(int i = 1; i < n; i += 2)
    

    即使你增加更多,它仍然会增加,仍然是O(n)

答案 1 :(得分:0)

该循环看起来不像O(log N)。就是这样,一个O(N / 2)循环。引用定义:

函数f(x)被认为是O(g(x))iff(当且仅当)存在正实数c,并且实数x0使得| f(x)| &lt; = c | g(x)|对于所有x> = x0。例如,您也可以调用该循环O(N),O(N ^ 2),O(N ^ 3),因为您可以轻松找到所需的参数。但是,你找不到能使O(log N)适合的参数。

至于O(log log N),我想你可以重写这里给出的插值搜索实现https://en.wikipedia.org/wiki/Interpolation_search来使用for循环。它平均为O(log log N)!

答案 2 :(得分:0)

您的费用不是O(logN)您的费用是O(N * logN)。

阅读link 您会看到一个功能示例,如:

enter image description here

无论多项式开头的数字是最大的多项式。

在你的情况下,它是

1/2 * n * log(n),1/2没有区别,你的复杂性是O(N * logN)