我这里的问题很少 考虑以下循环(让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:对不起我糟糕的数学概念
答案 0 :(得分:6)
O(log n)
循环:
for (i = 1; i <= n; i *= 2)
所以你在每一步加倍i
。基本上是:
O(n)
O(log n)
O(log log n)
乘法之后会发生什么?幂。所以这将是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 您会看到一个功能示例,如:
无论多项式开头的数字是最大的多项式。
在你的情况下,它是
1/2 * n * log(n),1/2没有区别,你的复杂性是O(N * logN)