问题描述
我在运行时分析方面有点挣扎,想看看这些是否正确。 如果有人能指出我是否犯了任何错误,我将不胜感激。
void f1(int* arr,int n){
for (int i = n; i > 0; i--) ---> time complexity = n
reverseArray(arr,i);
}
void reverseArray(int* arr,int n){
int left,right,temp;
for (left = 0,right = n-1; left <= right; left++,right--){ ---> time complexity = n
temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
对于 f1:T(n) = n * n = O(n^2)
int f2(int n){
int i,j,c;
arr = new int[n];
for (i = 0; i < n; i++) ---> time complexity = n
arr[i] = 7;
c = 0;
for (i = 0; i < n; i++) ---> time complexity = n
for (j = 1; j <= arr[i]; j++) ---> time complexity = n
c++;
delete []arr;
return c;
}
对于 f2:T(n) = n + n^2 = O(n^2)
解决方法
f1 的时间复杂度是正确的。
但是在 f2 中,
for (i = 0; i < n; i++) ---> time complexity = n
for (j = 1; j <= arr[i]; j++) ---> time complexity = n
c++;
对于每个 i,第二个 for 循环正好运行 a[i] 次,但是您已经在前一个 for 循环中初始化了 arr[i] = 7;
。
for (i = 0; i < n; i++) ---> time complexity = n
arr[i] = 7;
这意味着第二个 for 循环,
for (j = 1; j <= arr[i]; j++) ---> time complexity = n
c++;
对每个 i 运行 7 次,导致 7*n 次操作。
因此 f2 的总时间复杂度为 O( n + 7*n) = O(n)
int f2(int n){
int i,j,c;
arr = new int[n];
for (i = 0; i < n; i++) ---> time complexity = n
arr[i] = 7;
c = 0;
for (i = 0; i < n; i++) ---> time complexity = n
for (j = 1; j <= arr[i]; j++) ---> time complexity is 7,i.e O(1).
c++;
delete []arr;
return c;
}
对于 f2:T(n) = O(n) + O(n) * O(1) = O(n)。
可以使用任何数字而不是 7,不管这个常数,内循环的时间复杂度为 O(1)。如果 7 不是常数,而是函数 int f2(int n,int m)
的参数 m,则时间复杂度为 O(m),总和为 O(n*m)。