Временная сложность программы?

-4

1 i ← 1
2 while i < n/4
3 do
4 j ← 2i
5 while j < n
6 do
7 j ← j + 1
8 i ← i + 1

b) 1 i ← n
2 while i > 1
3 do
4 j ← i
5 while j < n
6 do
7 j ← 2j
8 i ← i − 1

c) 1 i ← 1
2 while i < n
3 do
4 j ← 0
5 while j ≤ i
6 do
7 j ← j + 1
8 i ← 2i

Учитывая эти три программы, какой был бы самый простой подход при поиске временной сложности для каждого из них? Я могу сказать, что первый, вероятно, будет O (n ^ 2). Но есть ли легкий подход к ним, чтобы решить его последовательно? Завтра у меня есть экзамен.

спросил(а) 2020-03-26T17:09:04+03:00 2 месяца назад
1
Решение
75

(Я проигнорирую прочь-на-1, округляя и т.д. В ограничениях суммирования)

A)

Во внутреннем цикле выполняется n - 2i - 1 операции. Во внешнем цикле вы выполняете n/4 - 1. Таким образом, сложность:

enter image description here

Итак, ваш ответ на первый правильный.

B)

Во внутреннем цикле j каждый раз удваивается, поэтому растет экспоненциально; поэтому внутренний цикл принимает логарифмическое время - log (n/i). (база 2, но игнорировать WLOG). Деление на i внутри происходит потому, что j начинается с i, поэтому эквивалентно началу от 1 и возрастанию до n/i. Во внешнем цикле вы выполняете n - 1 ops.

enter image description here

(Последний шаг из приближения Стирлинга)

C)

Во внутреннем цикле вы делаете i + 1 ops. Во внешнем цикле i растет экспоненциально от 1 до n, поэтому log n.

enter image description here

NB Я замечаю существенное расхождение с ответами TypeKazt; это иллюстрирует, что вы не можете просто "размножить" сложность внутреннего цикла и внешнюю петлю и что граничные условия для внутреннего цикла детерминистически важны.

EDIT: Как добавленное доказательство моих смелых обвинений против TypeKazt (hehe sorry buddy), вот несколько тестовых данных, которые я получил от реализации С#:

enter image description here enter image description here enter image description here

Как вы можете видеть, сложность A (линейная шкала) равна O(n^2), тогда как значения B и C (логарифмические шкалы) являются линейными.

Код:

static int A(int n)
{
int c = 0;
for (int i = 0; i < n / 4; i++)
for (int j = 2 * i; j < n; j++)
c++;
return c;
}

static int B(int n)
{
int c = 0;
for (int i = n; i > 1; i--)
for (int j = i; j < n; j *= 2)
c++;
return c;
}

static int C(int n)
{
int c = 0;
for (int i = 1; i < n; i *= 2)
for (int j = 0; j <= i; j++)
c++;
return c;
}

PS Я знаю, что политика SO заключается не в том, чтобы присматривать за людьми, но я для одного хорошо разбираюсь в примерах, поэтому надеюсь, что это поможет вам понять простой аналитический подход к анализу сложности.

ответил(а) 2020-03-26T17:25:01.034541+03:00 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

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