【问题标题】:Time Complexity in code?代码中的时间复杂度?
【发布时间】:2017-05-16 09:33:08
【问题描述】:

我有 fun1 电话 foo1() 需要 O(n^6 + m^4)。你觉得fun1的时间复杂度是多少?我的猜测是O(2n^6 + m^4) !!

int fun1(int n, int G[MAX][MAX])
{
  int x, ans;
  if(n < 2)
     return 1;
  for(x = 0; x < n; x++){
    G[n][x] = G[x][n] = 1;
  }
  ans = foo1(n+1, G);
  return ans;
}

fun2 也调用 foo2(),它需要 O(n^3 + m^2)。你觉得 fun2 的时间复杂度是多少?我的猜测是 O(n^3 + m^2 + 2n^2) !!

 int fun2(int n, int G[MAX][MAX])
 {
   int x, y, i, j;
   int ans = y = 0;
   int arr[MAX][MAX] = {};
   for(i = 0; i < n; i++) {
     for(j = 0; j < n; j++)
       arr[i][j] = G[i][j];
   }

   if(n <= 2)
     return 0;
   for(x = 0; x < n; x++){
     if(arr[y][x] && arr[x][y]){
       arr[y][x] = arr[x][y] = 0;
       arr[n+1][x] = arr[x][n+1] = 1;
       arr[y][n] = arr[n][y] = 1;
       if(foo2(n+2, arr))
         ans = 1;
       arr[n][y] = arr[y][n] = 0;
       arr[n+1][x] = arr[x][n+1] = 0;
       arr[y][x] = arr[x][y] = 1;
       if(ans == 1)
         break;
     }    
   }
   return ans;
  }

我说的对吗?

【问题讨论】:

  • 您想出这些答案的任何特殊原因,还是它们真的是随机猜测?这样的推理属于你的问题
  • 你为什么猜? fun1 做了一些小的计算,然后调用具有时间补偿的 foo(n+1, G)O((n+1)^6 + m^4) == O(n^6 + m^4)
  • 对于第一个我刚刚添加了一个,因为只有 1 个循环。我添加了第二个函数 n^2 + n 因为有一个双循环和一个单独的单循环。
  • 对于复杂性,我们关心的是“大局”。如果某物是n^3 + n,则+ n 将被忽略,因为nn^3 小得多。所以 `O(n^3 + m^2 + 2n^2)` 就是 `O(n^3 + m^2)`

标签: c algorithm time-complexity big-o hamiltonian-cycle


【解决方案1】:

对于fun1(),我不同意你的看法。在函数体中有一个 for 循环,它采用 O(n),然后是 foo1(n+1, G),它采用 O((n+1)6 + m4 )。将它们放在一起,我们得到:

O(n) + O((n+1)6 + m4) = O(n) + O(n6 + m4) = O(n6 + m4)


恐怕我也不同意你的第二个猜测,因为你有两个for循环,这让你猜到了你的猜测。

但是,请注意第二个 在其主体中调用foo2(n+2, arr)。结果,foo2() 将被调用 n 次!

把所有东西放在一起,我们有:

第一个 for 循环 + 第二个 for 循环 = O(n) + O(n(n + 2)3 + nm2) = O(n) + O(n4 + nm2) = O(n4 + nm2)

【讨论】:

  • 同意。对于第二个示例,重要的部分是每次都使用相同的参数调用 foo2。因此,它只是n 的复杂性的乘以foo2。如果电话是foo2(x+2, arr),它会给出不同的结果。
  • 正确@4386427,感谢您的评论和点赞!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多