包含递归函数的循环的时间复杂度

时间:2018-08-28 22:17:39

标签: loops recursion time complexity-theory

我很难处理以下代码的时间复杂度:

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);
}

谢谢!

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