← Назад к вопросам

Что такое O(n) в алгоритме?

1.0 Junior🔥 261 комментариев
#DevOps и инфраструктура#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Временная сложность O(n) в алгоритмах

O(n) — это нотация Big O, которая описывает временную сложность алгоритма. Она показывает, как растет время выполнения алгоритма в зависимости от размера входных данных.

Что означает O(n)?

O(n) означает линейную сложность — время выполнения алгоритма прямо пропорционально размеру входных данных. Если входных данных в 2 раза больше, то и время выполнения примерно в 2 раза дольше.

Простой пример

# O(n) — линейный алгоритм
def find_max(numbers):
    """Найти максимальное число в списке"""
    max_num = numbers[0]  # O(1)
    
    for num in numbers:   # O(n) — проходим по каждому элементу
        if num > max_num:
            max_num = num  # O(1)
    
    return max_num        # O(1)

# Общая сложность: O(1) + O(n) + O(1) = O(n)

Время выполнения зависит от длины numbers. Если list из 10 элементов, то проходим 10 итераций. Если из 1000 — то 1000 итераций.

Другие примеры O(n)

# O(n) — поиск элемента в списке
def search_element(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i
    return -1

# O(n) — подсчет элементов
def count_occurrences(arr, value):
    count = 0
    for num in arr:
        if num == value:
            count += 1
    return count

# O(n) — копирование списка
def copy_list(arr):
    new_list = []
    for element in arr:
        new_list.append(element)
    return new_list

Big O нотация: общая иерархия

От самого быстрого к самому медленному:

  1. O(1) — константное время (очень быстро)

    • Доступ к элементу по индексу в списке
    • Простая арифметическая операция
  2. O(log n) — логарифмическое время (быстро)

    • Бинарный поиск
    • Операции в сбалансированных деревьях
  3. O(n) — линейное время (приемлемо)

    • Простой поиск, проход по списку
    • Фильтрация элементов
  4. O(n log n) — линейное логарифмическое (медленнее)

    • Хорошие алгоритмы сортировки (merge sort, quick sort)
  5. O(n²) — квадратичное время (медленно)

    • Вложенные циклы
    • Простые алгоритмы сортировки (bubble sort, insertion sort)
  6. O(2ⁿ) — экспоненциальное время (очень медленно)

    • Наивные решения для комбинаторных задач
  7. O(n!) — факториальное время (крайне медленно)

    • Генерация всех перестановок

Визуальное сравнение

Для 1000 элементов:

  • O(1): 1 операция
  • O(log n): примерно 10 операций
  • O(n): 1000 операций
  • O(n log n): 10000 операций
  • O(n²): 1000000 операций
  • O(2ⁿ): более чем астрономическое число

Сравнение алгоритмов

# Плохо: O(n²) — вложенные циклы
def find_duplicates_slow(arr):
    for i in range(len(arr)):
        for j in range(i + 1, len(arr)):
            if arr[i] == arr[j]:
                return True
    return False

# Лучше: O(n) — используем set
def find_duplicates_fast(arr):
    seen = set()
    for num in arr:
        if num in seen:
            return True
        seen.add(num)
    return False

Для 10000 элементов:

  • Медленный алгоритм: 100 млн операций
  • Быстрый алгоритм: 10000 операций

Практическое применение в Python

# O(1) — доступ по индексу
first = arr[0]

# O(n) — поиск элемента
if target in arr:  # Проходит по всему списку
    pass

# O(n) — встроенные методы
index = arr.index(target)  # Линейный поиск
count = arr.count(target)  # Подсчет всех вхождений

# O(n) — сортировка? Нет! Встроенная сортировка O(n log n)
sorted_arr = sorted(arr)  # Использует Timsort

# O(n) — создание списка через list comprehension
new_list = [x * 2 for x in arr]

Почему O(n) важна?

  1. Масштабируемость — алгоритм O(n) работает приемлемо даже на больших данных
  2. Производительность — намного быстрее O(n²) и выше
  3. Проектирование — помогает выбрать правильную структуру данных и алгоритм

Когда O(n) хорошо, а когда плохо?

O(n) хорошо для:

  • Обработки большого количества данных
  • Потоков в реальном времени
  • Общей обработки коллекций

O(n) может быть проблемой, если:

  • Нужно частые поиски в больших коллекциях (используй хеш-таблицы)
  • Данные растут экспоненциально
  • Нужна очень высокая производительность

Понимание временной сложности критически важно для написания эффективного кода и выбора правильных структур данных и алгоритмов.

Что такое O(n) в алгоритме? | PrepBro