N-я полоса сложности недопонимания

52
6

#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) меня сбивает с толку.

спросил(а) 2018-06-02T21:28:00+03:00 1 год, 10 месяцев назад
1
Решение
62

Внешний цикл запускает двоичный поиск, который разделяет диапазон поиска пополам на каждой итерации. Он будет продолжаться до тех пор, пока диапазон поиска не будет уменьшен до 0.000005. Поэтому возникает вопрос: "сколько раз вам нужно разделить на 2, чтобы уменьшить диапазон поиска от d (который является начальным диапазоном) до 0.000005? Ответ - log_2(d/0.000005).

Внутренний цикл выполняется n раз. Таким образом, общее время работы пропорционально

n * log_2(d/0.000005)

Но это не сложность, потому что big-O игнорирует константы. Таким образом, база log игнорируется. И разделение игнорируется, потому что

n * log(d/0.000005) = n * (log(d) - log(0.000005))

Таким образом, сложность алгоритма O (n log (d)).

ответил(а) 2018-06-02T21:46:00+03:00 1 год, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема