Big-O小澄清

时间:2016-02-15 08:34:14

标签: 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;
}

4 个答案:

答案 0 :(得分:28)

函数f(n)通过重复除以2来计算n的基数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(log(N)) 与O(log(log(N))相同。

答案 1 :(得分:7)

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

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

答案 2 :(得分:3)

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

订单O(log2(n))的时间复杂度。这里2是logrithm的基础。

int g(int n) {
    int m = f(f(n)); // O(log2(log2(n))
    int i, x=0;
    for( i = 0; i < m; i++) {
        x += i*i;
    }
    // This for loop will take O(log2(log2(n))
   return m;
}

因此,给定函数的总时间复杂度为: T(n) = t1 + t2 + t3

但是这里O(log2(n))支配着O(log2(log2(n))

因此,给定函数的时间复杂度为log2(n)

请阅读What is a plain English explanation of "Big O" notation?一次。

答案 3 :(得分:1)

O(log n)算法消耗的时间仅线性地取决于n的位数。所以很容易扩展它。

假设您要计算F(100000000),即10 ^ 8th F .... ascci数。对于O(log n)算法,计算F(100)所需的时间仅为4倍。

O(log log n)术语可以显示在各种不同的位置,但通常会有两个主要路径到达此运行时。参考链接在此处输入代码here