我很难处理以下代码的时间复杂度:
int f(int n) {
int x=1;
for (int k=0; k<n; k++){
x *=n*n
}
g(n);
return x; }
其中g(n)是递归函数:
void g(int n){
if (n<1)
return;
g(n/2);
}
谢谢!
答案 0 :(得分:2)
int f(int n) {
int x=1;
// O(n) time complexity due to for loop
for (int k=0; k < n; k++) {
// O(1)
x *= n*n
}
// O(log n)(base 2) because for every time we divide by 2 before calling the function
g(n);
return x;
}
void g(int n){
if (n<1)
return;
g(n/2);
}
现在O(logn)比O(n)快,这意味着代码的总体时间复杂度仅为O(n)!
答案 1 :(得分:0)
g(n)
的复杂度为O(log n)
。
f(n)
的复杂度是O(n + log n)
(n
循环的for
,对log n
的调用的g(n)
) O(n)
,如Shipra Gupta指出。
int f(int n) {
int x=1;
for (int k=0; k < n; k++) { // O(n)
x *= n*n // O(1)
}
g(n); // O(log n)
return x;
}
O(n * 1 + log(n) + 1)
也就是说,如果我们忽略g(n)
永远不会达到n<1
条件的事实,如果n >= 1
(堆栈溢出!)...说到这-欢迎来到现场! :-P