Понятие «O» большого. Временная сложность.
При анализе сложности алгоритмов обычно используется понятие «O» большое. Пришло время узнать, что это такое.
Допустим, вы хотите найти максимум двух различных чисел. Сколько для этого нужно элементарных операций? Всего одна: сравнить два числа — большее и есть максимум.
А сколько нужно операций, чтобы найти максимум трёх разных чисел? Две: сначала ищем максимум первых двух чисел, потом сравниваем его с третьим числом. Ответом будет наибольшее. Аналогично для нахождения максимума из четырёх чисел потребуется три операции.
Легко заметить закономерность: чтобы найти максимум из n чисел, нужно выполнить n - 1 элементарную операцию.
Насколько изменится вычислительная сложность алгоритма при увеличении объёма входных данных? Если добавить одно число, количество сравнений увеличивается на единицу. Какая функциональная зависимость описывает эту закономерность?
Обозначим количество чисел за n, а количество элементарных операций, которые нужно выполнить для нахождения максимума — за T. Получаем, T = n - 1. Это уже знакомая вам линейная зависимость.
Уравнение линейной зависимости y = kx + b — как раз наш случай при k = 1 и b = -1. Алгоритм нахождения максимума имеет линейную сложность.
Говорят, что линейный алгоритм имеет сложность O(n). Простыми словами это означает, что количество элементарных операций в этом алгоритме будет пропорционально n, где n — размер входных данных. Слагаемое минус единицу при оценке не учитывают. Так поступают со всеми константными слагаемыми, потому что они не меняются при росте n, и нет возможности на них повлиять.
Если количество элементарных операций не зависит от объема входных данных, говорят, что сложность алгоритма равна O(1).
Рассмотрим ещё один пример. Вы собираетесь праздновать новый год со своими друзьями. Допустим, их m человек. Каждому другу надо придумать подарок, и вы хотите обсудить идеи с остальными участниками праздника. Для этого создаёте в любимом мессенджере чат про каждого из друзей, добавляя в него всех, кроме обсуждаемого человека. Какая будет сложность алгоритма, если за элементарную операцию считать добавление человека в чат?
Всего друзей m, значит будет создано m чатов. В каждый из чатов нужно добавить m - 1 человек (вы добавляетесь в чат автоматически при создании), то есть всего получится m(m - 1) операций. Вычислительная сложность алгоритма выражается соотношением T(m) = m² - m. На языке O-нотации скажем: алгоритм имеет сложность O(m²) (произносится как «О от эм в квадрате»). То есть количество элементарных операций будет пропорционально m². Почему мы выкинули - m? Потому что функция y = m² растёт гораздо быстрее, чем y = m, и при больших входных данных зависимость будет выглядеть, как квадратичная.