Что обозначает n в Big O Notation?

Ответ

В Big O Notation n обозначает размер входных данных алгоритма. Это ключевая переменная, используемая для описания того, как время выполнения или потребление памяти алгоритма масштабируется с ростом объема данных.

Основные классы сложности:

  • O(1) — Константная: Время выполнения не зависит от n. Например, доступ к элементу хеш-таблицы (объекта) по ключу.
  • O(n) — Линейная: Время выполнения растет пропорционально n. Классический пример — перебор массива.
  • O(n²) — Квадратичная: Время выполнения пропорционально квадрату n. Характерно для алгоритмов с вложенными циклами.

Примеры на Node.js:

// O(n) — линейный поиск
function findIndex(arr, target) {
  for (let i = 0; i < arr.length; i++) { // Цикл зависит от длины arr (n)
    if (arr[i] === target) {
      return i;
    }
  }
  return -1;
}

// O(n²) — проверка всех пар элементов
function hasDuplicate(arr) {
  for (let i = 0; i < arr.length; i++) { // Внешний цикл: O(n)
    for (let j = i + 1; j < arr.length; j++) { // Внутренний цикл: O(n)
      if (arr[i] === arr[j]) {
        return true;
      }
    }
  }
  return false;
}

Анализ через n позволяет объективно сравнивать алгоритмы и выбирать оптимальный для больших наборов данных.

Ответ 18+ 🔞

Смотри, объясню тебе про эту Big O, чтобы ты не охуел потом на собеседовании. Это, по сути, способ измерить, насколько твой алгоритм начинает тупить, когда данных становится овердохуища.

Вот смотри, n — это просто размер твоих входных данных. Сколько там элементов в массиве, записей в базе, нод в дереве. Всё. А сама нотация показывает, как время работы или память растут, когда n летит в космос.

Основные приколы, которые надо знать:

  • O(1) — Константная: Алгоритм работает за одно и то же время, хоть n будет десять, хоть десять миллионов. Ёпта, вот как взять значение из объекта по ключу — obj['key']. Не важно, сколько там ключей, доступ мгновенный. Красота.
  • O(n) — Линейная: Здесь всё просто — время растёт ровно во столько же раз, во сколько растёт n. Если данных в сто раз больше, и работать будешь в сто раз дольше. Классика — перебрать массив от начала до конца. Ебать копать, куда уж проще.
  • O(n²) — Квадратичная: А вот тут начинается пиздец. Время растёт как квадрат от n. Если n увеличить в 10 раз, работать будешь в 100 раз дольше. Обычно это признак того, что у тебя в коде вложенные циклы, и они друг по другу ездят. На больших данных такой алгоритм накроется медным тазом.

Смотри, как это выглядит в коде:

// O(n) — линейный поиск. Просто идём по массиву.
function findIndex(arr, target) {
  for (let i = 0; i < arr.length; i++) { // Чем больше массив (n), тем больше итераций
    if (arr[i] === target) {
      return i;
    }
  }
  return -1;
}

// O(n²) — проверка всех пар. Типичный пример, где можно облажаться.
function hasDuplicate(arr) {
  for (let i = 0; i < arr.length; i++) { // Первый цикл — O(n)
    for (let j = i + 1; j < arr.length; j++) { // Второй цикл внутри первого — вот она, O(n²)!
      if (arr[i] === arr[j]) {
        return true;
      }
    }
  }
  return false;
}

Короче, вся суть в том, чтобы смотреть на этот n и понимать: «Чувак, а не превратится ли моя красивая функция в тыкву, когда пользователей будет не десять, а десять миллионов?». Это и есть здравый смысл, обёрнутый в математику.