Big-O中函数的时间复杂度

时间:2016-02-14 21:18:34

标签: c big-o time-complexity

我正试图找到这个函数的时间复杂度:

int bin_search(int a[], int n, int x); // Binary search on an array with size n.

int f(int a[], int n) {
    int i = 1, x = 1;
    while (i < n) {
        if (bin_search(a, i, x) >= 0) {
            return x;
        }
        i *= 2;
        x *= 2;
    }
    return 0;
}

答案是(log n)^ 2。怎么来的? 我能得到的最好的是log n。首先i1,因此while将运行log n次。
首次互动时,i=1时,二进制搜索只有一次互动因为数组的大小是1(i)。然后,当i=2时,两次互动,依此类推,直到log n互动为止。
所以我认为合适的公式是this
总和是while,而内部等式是因为i=1它是log(1)i=2它是log(2),依此类推,直到它为log(n)在最后。

我哪里错了?

1 个答案:

答案 0 :(得分:3)

每次迭代都会对数组的第一个2^i元素执行二进制搜索。

您可以计算操作次数(比较):

log2(1) + log2(2) + log2(4) + ... + log2(2^m)

log(2^n)等于n,因此本系列简化为:

0 + 1 + 2 + ... + m

mfloor(log2(n))

系列评估为m * (m + 1) / 2,取代m我们得到

floor(log2(n)) * (floor(log2(n)) + 1) / 2

->  0.5 * floor(log2(n))^2 + 0.5 * floor(log2(n))

第一个元素支配第二个元素,因此复杂度为O(log(n)^2)