第N个数字复杂性的误解

时间:2018-06-02 18:28:42

标签: algorithm big-o complexity-theory

#include <stdio.h>

int main()
{
    double d;
    int n, i;
    double lower=0, upper=1, middle, product;
    scanf("%lf %d", &d, &n);
    if (d>upper) upper=d;
    while (upper-lower>0.000005)
    {
        middle=(upper+lower)/2;
        product=1;
        for (i=0; i<n; i++)
            product*=middle;
        if (product>d) upper=middle;
        else lower=middle;
    }
    printf ("%.5f\n",(lower+upper)/2);
    return 0;
}

为什么这个算法有O(n * log(d / 0.000005))复杂度? (d / 0.000005)部分对我来说很困惑。

1 个答案:

答案 0 :(得分:2)

外部循环正在运行二进制搜索,它在每次迭代时将搜索范围分成两半。它将一直持续到搜索范围缩小到0.000005。所以问题是,&#34;您需要除以2以将搜索范围从d(这是起始范围)减少到0.000005多少次?答案是log_2(d/0.000005)

内循环运行n次。因此整体运行时间与

成正比
n * log_2(d/0.000005)

但这不是复杂性,因为大O忽略了常量。因此忽略了log的基础。除法因为

而被忽略
n * log(d/0.000005) = n * (log(d) - log(0.000005))

因此算法的复杂性为O(n log(d))。