Проверяет понимание временной сложности Array.prototype.splice и её влияния на производительность при частых вставках и удалениях элементов массива.
Array.prototype.splice — это метод, который изменяет исходный массив: удаляет элементы, вставляет новые или заменяет существующие. Его временная сложность зависит от позиции операции и количества затронутых элементов. В худшем случае, когда вставка или удаление происходит в начале массива, всем оставшимся элементам нужно изменить индекс, то есть выполнить сдвиг. Это даёт O(n), где n — длина массива.
Массивы в JavaScript хранятся как непрерывная область памяти (или оптимизированная структура, близкая к ней). При вставке в середину или начало все элементы после позиции вставки должны быть перемещены на одну позицию вправо. При удалении — наоборот, сдвинуты влево. Чем больше массив и чем ближе позиция к началу, тем больше работы.
const arr = [1, 2, 3, 4, 5];
// Вставка в начало: все элементы сдвигаются
arr.splice(0, 0, 0); // O(n)
console.log(arr); // [0, 1, 2, 3, 4, 5]
// Удаление из середины: элементы после индекса 2 сдвигаются
arr.splice(2, 1); // O(n)
console.log(arr); // [0, 1, 3, 4, 5]
// Частая вставка в середину большого массива
for (let i = 0; i < 10000; i++) {
arr.splice(Math.floor(arr.length / 2), 0, i); // каждая операция O(n)
}
// Итоговая сложность O(n^2), что может быть очень медленно
Если требуется много вставок и удалений в произвольных позициях, массив — не лучший выбор. Можно использовать:
В простых случаях, когда вставки редки или массив небольшой, splice остаётся удобным и достаточно быстрым. Но в высоконагруженных сценариях с частыми модификациями середины массива стоит задуматься о смене структуры данных.
Итог: splice имеет сложность O(n) из-за сдвига элементов, поэтому при частых вставках в середину или начало массива лучше использовать альтернативные структуры данных, чтобы избежать квадратичной деградации производительности.