Theta表示法中此代码的运行时间是什么?

时间:2018-10-23 02:39:26

标签: algorithm runtime big-o

我相信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;
    }
}

1 个答案:

答案 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))