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

Что такое сложность по времени для алгоритма на примере O(n)?

1.6 Junior🔥 111 комментариев
#Python Core

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

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

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

Что такое сложность по времени для алгоритма на примере O(n)?

Временная сложность (Time Complexity) — это мера того, сколько примитивных операций выполняет алгоритм в зависимости от размера входных данных. Она обозначается нотацией Big O и показывает, как масштабируется время выполнения при увеличении размера входа.

O(n) — линейная сложность

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

Пример O(n): простой поиск в списке

def find_max(numbers):
    max_value = numbers[0]
    # Цикл выполняется n раз, где n = количество элементов
    for num in numbers:  # O(n)
        if num > max_value:
            max_value = num
    return max_value

# Если list из 10 элементов — 10 сравнений
# Если list из 1000 элементов — 1000 сравнений

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

# Сумма всех элементов
def sum_elements(arr):
    total = 0
    for num in arr:  # O(n)
        total += num
    return total

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

# Проверка, содержится ли элемент в списке
def contains(arr, value):
    for item in arr:  # O(n)
        if item == value:
            return True
    return False

Графическое представление O(n)

Операции
    |
    |     /
    |    /
    |   /
    |  /
    | /
    |/____________
         Размер входа (n)

Прямая линия показывает, что количество операций растет линейно вместе с размером входа.

Сравнение с другими сложностями

# O(1) — константная сложность
def get_first(arr):
    return arr[0]  # Всегда 1 операция

# O(log n) — логарифмическая сложность
def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:  # Выполняется log(n) раз
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

# O(n log n) — почти линейная
def merge_sort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    return merge(left, right)

# O(n²) — квадратичная (медленная)
def bubble_sort(arr):
    for i in range(len(arr)):  # O(n)
        for j in range(len(arr) - 1):  # O(n)
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

# O(2^n) — экспоненциальная (очень медленная)
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)  # 2^n вызовов

Таблица сложностей (от лучшей к худшей)

СложностьНазваниеПример
O(1)КонстантнаяДоступ к элементу по индексу
O(log n)ЛогарифмическаяБинарный поиск
O(n)ЛинейнаяПростой поиск в списке
O(n log n)Линейно-логарифмическаяMerge Sort, Quick Sort
O(n²)КвадратичнаяBubble Sort, Selection Sort
O(2^n)ЭкспоненциальнаяБрутфорс перебор подмножеств
O(n!)ФакториальнаяГенерация всех перестановок

Практический пример производительности

import time

def linear_algorithm(n):
    # O(n)
    total = 0
    for i in range(n):
        total += i
    return total

# Для n = 1,000,000: ~1ms
# Для n = 10,000,000: ~10ms
# Для n = 100,000,000: ~100ms

# Это демонстрирует линейный рост времени с увеличением n

Почему сложность важна

  1. Масштабируемость: O(n) работает хорошо для больших данных, O(n²) может быть неприемлемо
  2. Предсказуемость: Зная сложность, можно предсказать, сколько будет работать алгоритм
  3. Оптимизация: Выбор правильного алгоритма критичен для производительности
  4. Интервью: Это стандартный вопрос на собеседованиях

Заключение

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