我相信func2的运行时是O(n * log(n))。
但是有人告诉我不是。
int func2(int* arr, int n){
int i, j;
for (i = 1; i <= n; i *= 2)
reverseArray(arr, i);
}
}
void reverseArray(int* arr, int n){
int left, right, temp;
for (left = 0, right = n-1; left <= right; left++, right--){
temp = arr[left];
arr[left] = arr[right];
arr[left] = temp;
}
}
答案 0 :(得分:4)
func2
以线性时间运行,即O(n)
说明:
可以很容易地说反向数组方法的时间复杂度是线性的,即big-Theta(n)
假设func2
是用n = 8
调用的;
对reverseArray的调用将是:-
reverseArray(arr, 1)
reverseArray(arr, 2)
reverseArray(arr, 4)
reverseArray(arr, 8)
因此总运行时间= 1 + 2 + 4 + 8 = 15,即2 * 8-1
因此,如果n为2的幂,则总运行时间= O(2*n - 1)
如果n不是2的幂,则总运行时间将为{O(2*K - 1)
,其中K是小于n的2的最高幂。我们可以放心地说,O(2*K - 1) = O(2*n - 1)
[因为O是上限]
O(2*n - 1) = O(n)
对于theta表示法,下界是O(2*K - 1)
,其中K是小于n的2的最高幂。
因此,时间复杂度= Theta(2^(floor(log(n)base2)+1))