Sobes.tech
Middle
95
questionbank

Откуда берется понятие временной сложности O(n) и почему она предпочтительнее O(n²)?

Ответ от нейросети

sobes.tech AI

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

O(n²) означает, что время выполнения алгоритма растет квадратично с увеличением размера входных данных. Это типично для алгоритмов, где выполняются вложенные итерации по данным (например, два вложенных цикла, каждый из которых проходит по n элементам).

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

Пример: Если n = 1000: O(n) - время выполнения пропорционально 1000 O(n²) - время выполнения пропорционально 1000² = 1 000 000

# Пример алгоритма с O(n)
def find_max(arr):
  """Находит максимальный элемент в списке."""
  max_val = arr[0] # O(1) - константное время
  for item in arr: # O(n) - цикл по всем n элементам
    if item > max_val: # O(1)
      max_val = item # O(1)
  return max_val # O(1)
# Общая сложность: O(1) + O(n) * (O(1) + O(1)) + O(1) = O(n)
# Пример алгоритма с O(n²)
def bubble_sort(arr):
  """Сортировка пузырьком."""
  n = len(arr) # O(1)
  for i in range(n): # Внешний цикл - O(n)
    for j in range(0, n - i - 1): # Внутренний цикл - O(n)
      if arr[j] > arr[j + 1]: # O(1)
        arr[j], arr[j + 1] = arr[j + 1], arr[j] # O(1)
# Общая сложность: O(1) + O(n) * O(n) * (O(1) + O(1)) = O(n²)
Временная сложность Пример роста времени выполнения (условные единицы)
O(n) n
O(n²) n * n