Big-O小澄清

Som*_*ion 20 c big-o time-complexity

O(log(log(n)))实际上只是O(log(n))当谈到时间复杂度?
你是否同意这个函数g()的时间复杂度O(log(log(n)))

int f(int n) {
    if (n <= 1)
        return 0;
    return f(n/2) + 1;
}

int g(int n) {
    int m = f(f(n));
    int i;
    int x = 0;
    for (i = 0; i < m; i++) {
        x += i * i;
    }
    return m;
}
Run Code Online (Sandbox Code Playgroud)

chq*_*lie 28

功能f(n)计算在底数的对数2n由反复除以2.它迭代log 2(n)次.

在它自己的结果上调用它确实会返回log 2(log 2(n))以进行额外的 log 2(log 2(n))迭代.到目前为止,复杂度为O(log(N))+ O(log(log(N)).第一项占第二项,总体复杂度为O(log(N)).

最后一个循环迭代log 2(log 2(n))次,该最后阶段的时间复杂度为O(log(log(N)),在初始阶段之前可忽略不计.

请注意,由于x在函数结束之前未使用g,因此不需要计算它,编译器可能会很好地优化此循环.

总的时间复杂出来为O(日志(N)) ,这是一样的O(日志(日志(N)).

  • 我要注意,虽然O(log N)不等于O(log log N),但O(log log N)函数也是O(log N)函数(O bound不必紧密). (5认同)
  • 为清楚起见,尝试格式化日志<sub> 2 </ sub>. (2认同)

250*_*501 7

看起来像是log(n) + log(log n) + log(log n).

按顺序:第一次递归f(),加上第二次递归f()和for循环,因此最终复杂度为O(log n),因为忽略了较低阶项.