Какова сложность поиска заблокированных товаров в List внутри цикла по товарам и как её оптимизировать?

Если для каждого из n товаров делать List.Contains по m заблокированным ID, время составляет O(nm). Постройте HashSet заблокированных ID и получите в среднем O(n + m).

Короткий ответ

Что ответить на собеседовании

Если для каждого из n товаров делать List.Contains по m заблокированным ID, время составляет O(nm). Постройте HashSet заблокированных ID и получите в среднем O(n + m).

Подробный разбор

Ответ с пояснениями

Если для каждого из n товаров делать List.Contains по m заблокированным ID, время составляет O(nm). Постройте HashSet заблокированных ID и получите в среднем O(n + m).

var blockedIds = new HashSet<int>(blocked.Select(x => x.Id));
var allowed = products.Where(x => !blockedIds.Contains(x.Id));

Построение множества требует O(m) дополнительной памяти. Проверка в HashSet обычно O(1), но зависит от хеша и сравнения. Allowed здесь ленивый; ToList нужен только при необходимости материализации. Если данные находятся в БД, выгоднее может быть NOT EXISTS или join на стороне СУБД вместо загрузки всех записей в память.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее