#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)部分对我来说很困惑。
答案 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))。