Назад к вопросам
Middle
80
questionbank

Что такое нотация 'О большой' и как она используется в программировании?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

Нотация O большое (Big O notation) описывает верхнюю границу времени выполнения или объема памяти алгоритма в зависимости от размера входных данных (n). Она позволяет оценить масштабируемость алгоритма при росте входных данных. Применяется для сравнения эффективности алгоритмов и выбора наиболее подходящего решения для конкретной задачи.

Часто встречающиеся классы сложности:

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

Примеры:

Перебор массива:

// O(n)
function findElement(arr, target) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === target) {
      return true;
    }
  }
  return false;
}

Бинарный поиск:

// O(log n)
function binarySearch(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (arr[mid] === target) {
      return mid;
    } else if (arr[mid] < target) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }
  return -1;
}

Таблица сравнения роста:

O-нотация Название Рост при увеличении n Пример
O(1) Постоянное Медленный (нет роста) Доступ по индексу
O(log n) Логарифмическое Медленный Бинарный поиск
O(n) Линейное Умеренный Перебор массива
O(n log n) Линейно-логарифмическое Средний Быстрая сортировка
O(n^2) Квадратичное Быстрый Сортировка пузырьком
O(2^n) Экспоненциальное Очень быстрый Перебор подмножеств