Проверяет понимание алгоритмической сложности метода includes внутри цикла и умение оценивать итоговую производительность кода.
Метод includes у массивов и строк выполняет линейный поиск: он поочерёдно сравнивает каждый элемент с искомым значением, пока не найдёт совпадение или не дойдёт до конца. Значит, в худшем случае его сложность равна O(n), где n — длина коллекции.
Если includes вызывается внутри цикла, который тоже проходит по массиву, сложности перемножаются:
includes — O(n);На массиве из 10 000 элементов это уже около 100 миллионов операций сравнения, что заметно замедляет код.
const arr = [1, 2, 3, 4, 5];
// O(n^2): для каждого элемента снова перебираем массив
for (const x of arr) {
if (arr.includes(x * 2)) {
console.log(x);
}
}
// O(n): заранее строим Set и проверяем за O(1)
const set = new Set(arr);
for (const x of arr) {
if (set.has(x * 2)) {
console.log(x);
}
}Set или Map — проверка наличия становится O(1).Итог: includes внутри цикла — типичная причина квадратичной сложности. Если коллекция большая и проверок много, стоит заранее построить Set или Map и получить линейное решение.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию