Как найти верхнюю и нижнюю границу кода?

55
5

У меня есть код и текст

Для следующего кода найдите нижнюю и верхнюю границу, если даны данные для функции f, g, и мы знаем, что задан лучший и худший случай, в большинстве случаев условие выполняется.

f: O (log (n)), а нижняя граница равна 1

g: O (n) и нижняя граница равна (logn) ^ 2

Я думаю, что первая строка моего кода - logn, затем, так как n> log (n), я думаю, что вторая строка - O (n * log (n)), а последние строки - nlogn, я думаю, потому что, если я использую суммирование, я получаю logn (n+ (logn) ^ 2-1) конец, тогда O является O (n ^ 2 (logn) ^ 2). А для нижней границы n (logn) ^ 3, я новичок в этом, поэтому, пожалуйста, скажите мне, где я ошибаюсь. Спасибо

for(int i=n;i>0;i/=2)
if(f()<=g())
for(int j=f()*f();j<n;j++)
f()

спросил(а) 2019-01-12T21:23:00+03:00 10 месяцев, 3 недели назад
1
Решение
69

Ваш код плохо отформатирован, поэтому не совсем понятно, что такое поток кода. Предполагая, что ваш код на самом деле эквивалентен:

for(int i=n; i>0; i/=2) {
if(f()<=g()) {
for(int j=f()*f(); j<n; j++) {
f();
}
}
}

Вам нужно найти лучшие и худшие показатели производительности.

ИМХО, легче пройти изнутри наружу (по крайней мере, пока не наберешься опыта):

Самым внутренним вызовом f() является O(log(n)) в худшем случае и O(1) в лучшем случае.

Так как f()*f() является константой, внутренний цикл в O(n) раз превышает предыдущий шаг (который равен f()) + 2 раза в f() для начального значения j +, также есть O(n) проверки условий и приращения O(n) которые вместе могут быть выражены как один O(n). Таким образом, для наихудшего случая это O(n*log(n) + 2*log(n) + n) которое является O(n*log(n)) а для лучшего случая это O(n*1 + 2 + n) который есть O(n)

Само if себе if - это просто время вычисления f() и g(). Поскольку условие в основном выполняется, мы просто добавляем стоимость внутреннего цикла. Таким образом, в худшем случае это O(log(n) + n + n*log(n)) что является O(n*log(n)) а в лучшем случае это O(1 + log^2(n) + n) есть O(n) (O(n) доминирует над O(log^2(n)))

Внешний цикл, как вы правильно заметили, всегда O(log(n)) раз. Таким образом, общая сложность составляет O(log(n)) раз тела (+ не забывайте о проверке и приращении, это может иметь значение, если условие в основном ложно). Таким образом, наихудший случай - это O(log(n)*n*log(n)+log(n)) который равен O(n*log^2(n)) а лучший вариант - O(log(n)*n + log(n)) что есть O(n*log(n)).

Надеюсь, я не испортил детали. Но самое главное - понять, когда добавлять, когда умножать; и понять, какая часть доминирует над другими, когда вы упрощаете.

ответил(а) 2019-01-13T03:47:00+03:00 10 месяцев, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

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