Выбор ответа Junior Разминка: короткие функции спрашивают часто обновлено

Сложность пересечения через includes

Вопрос

Какова сложность функции при длинах массивов n и m, и как её улучшить?

const intersect = (a, b) => a.filter((x) => b.includes(x));

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: O(n·m); если положить b в Set и проверять has, будет O(n + m). includes у массива перебирает элементы линейно, и он вызывается для каждого из n элементов a: итого O(n·m).

Варианты ответа

  1. O(n·m); если положить b в Set и проверять has, будет O(n + m)правильный ответ
  2. O(n): filter проходит a один раз, улучшать здесь нечего
  3. O(n log m), потому что includes использует бинарный поиск по b
  4. O(n + m): includes работает за константу благодаря кешу движка

Разбор

includes у массива перебирает элементы линейно, и он вызывается для каждого из n элементов a: итого O(n·m). Set.has в среднем работает за O(1), поэтому const s = new Set(b); a.filter((x) => s.has(x)) даёт O(n + m) по времени и O(m) по памяти. Бинарного поиска includes не делает: массив не обязан быть отсортирован.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.