Какая сложность алгоритма нахождения пересечения двух массивов

Ответ

Наивное решение с вложенными циклами имеет сложность O(n*m), где n и m — длины массивов.

Оптимальное решение с использованием хэш-таблицы (Set):

  1. Создаем Set из первого массива — O(n)
  2. Фильтруем второй массив, оставляя элементы из Set — O(m)
  3. Общая сложность — O(n + m)

Пример:

function intersection(arr1, arr2) {
  const set = new Set(arr1);
  return arr2.filter(item => set.has(item));
}

Если массивы отсортированы, можно использовать метод двух указателей со сложностью O(n + m) без дополнительной памяти.

Ответ 18+ 🔞

А, ну это же классика, блядь! Смотри, как обычно бывает: сидит такой разработчик, чешет репу, и думает: "Да ебана-рот, тут же просто! Два цикла, хуяк-хуяк — и готово!". И пишет он это своё "произведение", а сложность у него получается O(n*m), то есть, если массивы по миллиону элементов — пиздец, комп просто встанет колом, как Герасим над прудом с Муму, блядь.

А потом приходит какой-нибудь хитрожопый сеньор, смотрит на этот код и такой: "Э, сабака сука, э бошка думай!". И предлагает решение, от которого волосы дыбом — не от сложности, а от простоты, ёпта!

Вот смотри, гениальность в чём:

  1. Берёшь первый массив и нахуяриваешь из него Set. Это, типа, такая штука, где всё уникальное и искать там — мгновенно, O(1). Затраты — O(n).
  2. Потом проходишься по второму массиву и фильтруешь его, оставляя только те элементы, которые есть в этом сете. Затраты — O(m).
  3. Итого: O(n + m). Вместо O(n*m)! Это как вместо того, чтобы пешком через всю страну тащиться, сесть на хуй с горы и прилететь за секунду. Удивление пиздец!

Вот тебе пример кода, красота же:

function intersection(arr1, arr2) {
  const set = new Set(arr1);
  return arr2.filter(item => set.has(item));
}

Но! Если тебе вдруг принесут массивы уже отсортированные — тут вообще ёперный театр начинается. Можно использовать метод двух указателей. Это как два чекиста идут по двум спискам, сверяют фамилии, и никому не нужно лишней памяти — O(n + m) и терпения ноль ебать на доп. расходы.

Короче, мораль: прежде чем вложенные циклы городить, подумай — а нет ли тут хитрых структур данных, которые всё ускорят, как ёбаный турбонаддув?