← Назад к вопросам
Что такое сложность по времени для алгоритма на примере 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
Почему сложность важна
- Масштабируемость: O(n) работает хорошо для больших данных, O(n²) может быть неприемлемо
- Предсказуемость: Зная сложность, можно предсказать, сколько будет работать алгоритм
- Оптимизация: Выбор правильного алгоритма критичен для производительности
- Интервью: Это стандартный вопрос на собеседованиях
Заключение
O(n) — это один из самых распространенных классов сложности. Алгоритмы с линейной сложностью обычно считаются приемлемыми и хорошо масштабируются. Для любого алгоритма важно понимать его временную сложность, чтобы выбирать оптимальные решения для конкретных задач.