← Назад к вопросам
Какая алгоритмическая сложность вставки в нулевую позицию списка Python?
1.0 Junior🔥 231 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Сложность вставки в нулевую позицию: O(n)
Ответ простой: вставка элемента в начало списка Python имеет сложность O(n), где n — количество элементов в списке.
Почему O(n)?
Python списки используют динамический массив (как ArrayList в Java). Элементы хранятся в памяти подряд:
До вставки:
Мемория: [10] [20] [30] [40] [50] [ ] [ ]
Индекс: 0 1 2 3 4
Вставляем значение 5 в позицию 0:
После вставки:
Мемория: [5] [10] [20] [30] [40] [50] [ ]
Индекс: 0 1 2 3 4 5
Что происходит внутри list.insert(0, element):
- Сдвиг всех элементов на одну позицию вправо: 10 к 1, 20 к 2, 30 к 3 и т.д. Это n операций!
- Вставка нового элемента в позицию 0: 1 операция
- Возможное переразмещение в памяти если массив переполнен: O(n) дополнительно
Итого: n операций сдвига + возможное переразмещение = O(n).
Сравнение со вставкой в конец
Вставка в конец (list.append()) имеет O(1) амортизированную сложность:
ls = [1, 2, 3, 4, 5]
# O(n) — медленно, нужно сдвинуть все
ls.insert(0, 999) # [999, 1, 2, 3, 4, 5]
# O(1) — быстро, просто добавляем в конец
ls.append(999) # [1, 2, 3, 4, 5, 999]
Практический пример
import time
# Тестируем вставку в начало
ls = list(range(100000))
start = time.time()
ls.insert(0, -1)
print(f"Вставка в начало 100k элементов: {time.time() - start:.4f} сек")
# Тестируем вставку в конец
ls = list(range(100000))
start = time.time()
ls.append(-1)
print(f"Вставка в конец 100k элементов: {time.time() - start:.6f} сек")
Как не попасть в ловушку
Плохо — O(n²) сложность
result = []
for item in items:
result.insert(0, item) # Вставляем в начало КАЖДЫЙ раз
Хорошо — O(n) сложность
# Вариант 1: добавляй в конец, потом разворачивай
result = []
for item in items:
result.append(item)
result.reverse()
# Вариант 2: используй collections.deque
from collections import deque
result = deque()
for item in items:
result.appendleft(item) # O(1) в deque!
deque vs list для вставки в начало
from collections import deque
import time
# Вставка в начало со списком — O(n²) в цикле
start = time.time()
ls = []
for i in range(10000):
ls.insert(0, i)
print(f"list.insert(0): {time.time() - start:.4f} сек")
# Вставка в начало с deque — O(n) в цикле
start = time.time()
dq = deque()
for i in range(10000):
dq.appendleft(i)
print(f"deque.appendleft(): {time.time() - start:.6f} сек")
Практический совет на собеседовании
Вставка в позицию 0 это O(n), потому что нужно переместить все n элементов вправо. Если часто нужно вставлять в начало, используй deque, где appendleft() это O(1).
Это показывает:
- Понимание внутреннего устройства списков
- Знание альтернатив
- Практический опыт оптимизации