Можно ли применять вложенные циклы и как оптимизировать алгоритмы
Что проверяют
Умеете ли вы оценивать сложность до того, как код попадёт в прод, и понимаете ли, что во фронтенде тормозит обычно не арифметика, а главный поток. Обычно следом просят переписать наивное решение с квадрата на линейное или посчитать сложность вашего кода вслух.
Как отвечать
Начните с прямого ответа: вложенные циклы применять можно, вопрос в размере данных. Для 20 элементов O(n^2) это 400 операций и обсуждать нечего. Для 10 000 это уже 100 миллионов, и вкладка подвиснет на секунды.
Дальше по инструментам:
- хеш-структуры:
SetиMapдают поиск за O(1) в среднем, пересечение двух массивов сводится к одному проходу вместо двойного; - сортировка плюс два указателя: O(n log n) и линейный проход, когда нужен порядок или пары по сумме;
- предпосчёт: индекс по ключу собирается один раз до цикла, а не строится заново на каждой итерации;
- ранний выход:
some,findилиbreak, когда достаточно первого совпадения.
Отдельно назовите скрытые вложенные циклы, это всегда ценится: find или includes внутри map, поиск по массиву при рендере каждой строки списка, querySelector в цикле, накопление через [...acc, item] в reduce, которое превращает линейный проход в квадратичный из-за копирования.
Во фронтенде добавьте контекст: тяжёлый цикл блокирует главный поток и портит отзывчивость, то есть метрику INP. Поэтому рядом с алгоритмом стоят виртуализация длинных списков, разбиение работы на кадры, вынос расчётов в Web Worker, мемоизация промежуточных результатов. И обязательно скажите про замер: performance.now() и панель Performance вместо догадок, потому что константа и работа с памятью иногда решают больше, чем асимптотика.
Где спотыкаются
Называют сложность наугад, по числу видимых циклов. Считать надо по реальной вложенности, помня, что includes и filter внутри тоже проход по массиву.
Оптимизируют то, что не тормозит. Профиль обычно показывает пересчёт стилей, парсинг JSON или лишние ререндеры, а не цикл на тысячу элементов.
Уходят в микрооптимизации вроде выбора между for и forEach или кеширования length, забывая, что смена структуры данных даёт выигрыш в сотни раз, а не на проценты.