在时间复杂性方面,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;
}
答案 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。