Определение временной сложности алгоритма

64
4

Ниже приведен какой-то псевдокод, который я написал, что, учитывая массив A и целочисленное значение k, возвращает true, если в есть две различные целые числа в k, и в противном случае возвращает false. Я пытаюсь определить временную сложность этого алгоритма.

Я предполагаю, что сложность этого алгоритма в худшем случае равна O (n ^ 2). Это связано с тем, что первый цикл цикла выполняется n раз, а цикл for внутри этого цикла также выполняется n раз. Оператор if делает одно сравнение и возвращает значение, если true, которые являются одновременно операциями с постоянным временем. Заключительный оператор возврата также является постоянной операцией времени.

Правильно ли я предполагаю? Я новичок в алгоритмах и сложности, поэтому, пожалуйста, поправьте меня, если я поступил не так!

Algorithm ArraySum(A, n, k)
for (i=0, i<n, i++)
for (j=i+1, j<n, j++)
if (A[i]+A[j]=k)
return true
return false

спросил(а) 2020-03-26T15:27:29+03:00 2 месяца назад
1
Решение
91

Азодические рассуждения неверны. Внутренний цикл не просто выполняется n-1 раз. Таким образом, вы не должны использовать (outer iterations)*(inner iterations) для вычисления сложности.

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

Правильно, что при первом запуске цикла он будет выполнять n-1 итерации. Но после этого количество итераций всегда уменьшается на единицу:

    n - 1 n - 2 n - 3 ... 2 1

Мы можем использовать трюк Гаусса (вторая формула), чтобы суммировать этот ряд, чтобы получить n(n-1)/2 = (n² - n)/2. Это то, сколько раз сравнение выполняется в общем в худшем случае.

Отсюда видно, что граница не может быть более жесткой, чем O(n²). Как вы можете видеть, нет необходимости гадать.

Обратите внимание, что вы не можете предоставить значимую нижнюю границу, потому что алгоритм может завершиться после любого шага. Это означает, что наилучшим вариантом алгоритма является O(1).

ответил(а) 2020-03-26T15:42:51.231890+03:00 2 месяца назад
53

Да. В худшем случае ваш алгоритм O (n 2 ).

Ваш алгоритм O (n 2 ), потому что каждый экземпляр входов требует временной сложности O (n 2 ).
Ваш алгоритм равен Ω (1), поскольку для одного экземпляра входных данных требуется только временная сложность Ω (1).

Следующее появляется в главе 3 "Рост функции", "Введение в алгоритмы", в соавторстве с Корменом, Лейсерсоном, Ривестом и Штейном.
Когда мы говорим, что время работы (без модификатора) алгоритма равно Ω (g (n)), мы имеем в виду, что нет какого-либо конкретного ввода размера n для каждого значения n, время работы на этом входе составляет наименьшее постоянное время g (n), при достаточно большом n.

Учитывая вход, в котором суммирование первых двух элементов равно k, этот алгоритм будет принимать только одно дополнение и одно сравнение перед возвратом true. Поэтому этот вход требует постоянной временной сложности и делает время работы этого алгоритма Ω (1).

Независимо от того, что представляет собой вход, этот алгоритм будет принимать не более n (n-1)/2 дополнений и n (n-1)/2 сравнений перед возвратом значения. Следовательно, время работы этого алгоритма равно O (n 2 )

В заключение можно сказать, что время работы этого алгоритма падает между Ω (1) и O (n 2 ). Мы могли бы также сказать, что наихудший ход этого алгоритма равен Θ (n 2 ).

ответил(а) 2020-03-26T15:27:29+03:00 2 месяца назад
-5

Вы правы, но позвольте мне немного пояснить:

Это связано с тем, что первый цикл цикла выполняется n раз, а цикл for внутри этого цикла также выполняется n раз.

Фактически, второй цикл будет выполняться в течение (ni-1) раз, но с точки зрения сложности он будет приниматься только как n. (обновлено на основе комментария phant0m)

Итак, в худшем случае scenerio, он будет работать для n * (ni-1) * 1 * 1 раз. который является O(n^2).

в лучшем случае scenerio, он работает на 1 * 1 * 1 * 1 раз, что равно O(1) т.е. постоянному.

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

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