Если для каждого из n товаров делать List.Contains по m заблокированным ID, время составляет O(nm). Постройте HashSet заблокированных ID и получите в среднем O(n + m).
Какова сложность поиска заблокированных товаров в 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).
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 на стороне СУБД вместо загрузки всех записей в память.