Проверяет понимание временной сложности операции вставки в начало динамического массива и причины её линейной зависимости от размера массива.
Массив — это непрерывная область памяти, где каждый элемент хранится последовательно. Когда мы добавляем элемент в начало, мы не можем просто "вставить" его, не нарушив порядок остальных. Вместо этого нужно сдвинуть все существующие элементы на одну позицию вправо, чтобы освободить индекс 0. Этот сдвиг требует выполнения n операций копирования (или перемещения), где n — текущее количество элементов в массиве. Таким образом, время выполнения растёт линейно с размером массива, что и обозначается как O(n).
const arr = [2, 3, 4, 5];
// Добавляем 1 в начало
for (let i = arr.length; i > 0; i--) {
arr[i] = arr[i - 1]; // сдвиг вправо
}
arr[0] = 1;
console.log(arr); // [1, 2, 3, 4, 5]Каждый вызов цикла — это одна операция. Если в массиве 1000 элементов, потребуется 1000 сдвигов. Именно поэтому вставка в начало — дорогая операция.
В реальных проектах, если нужно часто добавлять элементы в начало, лучше использовать структуры данных, оптимизированные для этого, например, связные списки (linked list) или deque. В JavaScript для частых вставок в начало можно использовать unshift(), но нужно помнить о его стоимости. В языках с низкоуровневым управлением памятью (C, C++) иногда применяют кольцевые буферы или списки.
Понимание O(n) для вставки в начало массива помогает выбирать правильные структуры данных: если операция частая — стоит рассмотреть альтернативы, если редкая — массив остаётся эффективным решением.