Ответ
Сложность алгоритмов — это мера, описывающая, как количество ресурсов (обычно время выполнения или используемая память) зависит от размера входных данных.
Различают временную сложность (время выполнения) и пространственную сложность (объем памяти).
Основные классы асимптотической сложности (Big O Notation):
-
O(1) – Константная. Время выполнения не зависит от размера данных. Пример: доступ к элементу массива по индексу.
arr := [3]int{1, 2, 3} _ = arr[0] // O(1)
-
O(log n) – Логарифмическая. Время выполнения растет логарифмически. Характерна для алгоритмов, которые на каждом шаге отбрасывают часть данных. Пример: бинарный поиск в отсортированном массиве.
-
O(n) – Линейная. Время выполнения растет прямо пропорционально размеру данных. Пример: перебор всех элементов в срезе.
for _, v := range arr { // O(n) // ... }
-
O(n log n) – Линейно-логарифмическая. Часто встречается в эффективных алгоритмах сортировки. Пример: быстрая сортировка (Quick Sort), сортировка слиянием (Merge Sort).
-
O(n²) – Квадратичная. Время выполнения растет пропорционально квадрату размера данных. Типично для вложенных циклов. Пример: пузырьковая сортировка (Bubble Sort).
for i := 0; i < n; i++ { // O(n²) for j := 0; j < n; j++ { // ... } }
-
O(2ⁿ) – Экспоненциальная. Время выполнения удваивается с каждым новым элементом. Такие алгоритмы очень медленные. Пример: рекурсивный расчет чисел Фибоначчи без мемоизации.
-
O(n!) – Факториальная. Время выполнения растет факториально. Применяется к очень небольшим наборам данных. Пример: решение задачи коммивояжёра методом полного перебора.