Что такое временная и пространственная сложность алгоритма?

Ответ

Сложность алгоритма — это мера, описывающая зависимость времени выполнения (временная сложность) или объема требуемой памяти (пространственная сложность) от размера входных данных.

Для оценки сложности используется нотация Big-O (O-большое), которая описывает поведение алгоритма в худшем случае при увеличении объема данных.

Основные классы сложности:

  • O(1)Константная: время выполнения не зависит от размера данных (например, доступ к элементу массива по индексу).
  • O(log n)Логарифмическая: время выполнения растет логарифмически (например, бинарный поиск в отсортированном массиве).
  • O(n)Линейная: время выполнения растет прямо пропорционально размеру данных (например, перебор всех элементов массива).
  • O(n log n)Линейно-логарифмическая: типична для эффективных алгоритмов сортировки (например, быстрая сортировка, сортировка слиянием).
  • O(n²)Квадратичная: время выполнения растет пропорционально квадрату размера данных (например, вложенные циклы, сортировка пузырьком).
  • O(2ⁿ)Экспоненциальная: очень медленные алгоритмы, часто связанные с полным перебором (например, рекурсивный расчет чисел Фибоначчи).

Примеры на Go:

// O(n) — Линейная сложность
// Время работы зависит от количества элементов в срезе.
func findElement(slice []int, element int) bool {
    for _, v := range slice { // Цикл выполнится n раз
        if v == element {
            return true
        }
    }
    return false
}

// O(n²) — Квадратичная сложность
// Вложенный цикл приводит к n*n итерациям.
func hasDuplicates(slice []int) bool {
    n := len(slice)
    for i := 0; i < n; i++ { // Выполняется n раз
        for j := 0; j < n; j++ { // Выполняется n раз для каждой итерации внешнего цикла
            if i != j && slice[i] == slice[j] {
                return true
            }
        }
    }
    return false
}