Как считать сложность алгоритма?

Задумался вот о такой, казалось бы, простой вещи и понял, что у меня здесь пробел в знаниях. Что я имею ввиду когда говорю о подсчете сложности алгоритма? К примеру вы написали какую-то функцию, которая: сортирует два массива, проходится по ним циклом составляя на их основе некий новый массив и в конце, прежде чем вернуть полученный массив, реверсирует его - какая в итоге будет сложность алгоритма? Я знаю что операция сортировки имеет логарифмическую сложность, а цикл по элементам и реверс - линейную. Но какова сложность самой функции в результате? Она будет равна самой медленной операции (в таком случае это будет линейная сложность) или это будет какой-то новый вариант, где мы просто сложим все 4 имеющихся сложности (вроде 2 log_comp + 2 linear_comp)?

Заранее спасибо!


Ответы (1 шт):

Автор решения: AlexGlebe

Сложность алгоритма расчистывается показывая относительный класс. Например если сравнивать O(n^2) и O(n), то деление их друг на друга приведёт к бесконечному увеличению :

введите сюда описание изображения

и это значит, что эти скорости отличаются на порядок.

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

введите сюда описание изображения

если это добавление не слишком громоздкое. Например при маленьких значениях n может быть увеличено время на треть, а при больших уже только +10%. Сложность будет O(n*Log[n]). введите сюда описание изображения Если например добавить n^(3/2) то узнать что из них перевесит можно опять делением.

введите сюда описание изображения

Бесконечность означает, что при увеличении количества n степень n^(3/2) будет намного больше чем логарифм n*Log[n]. Сложность будет O(n^(3/2)).


Если отношение в скорости отличаются на конечное число, например в два раза, то это константное соотношение на класс скорости не влияет.

→ Ссылка