【发布时间】: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将被忽略,因为n比n^3小得多。所以 `O(n^3 + m^2 + 2n^2)` 就是 `O(n^3 + m^2)`
标签: c algorithm time-complexity big-o hamiltonian-cycle