Выбор ответа 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).
Варианты ответа
- O(n·m); если положить
bвSetи проверятьhas, будет O(n + m)правильный ответ - O(n):
filterпроходитaодин раз, улучшать здесь нечего - O(n log m), потому что
includesиспользует бинарный поиск поb - 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 ошибок.
Ещё по теме «Разминка: короткие функции»
- Array.from({ length })
- Сортировка строк по-русски
- Мутировать вход или нет
- average
- sortedIndex
- chunk
- compact
- countBy