PassFront
  1. PassFront
  2. База знаний
  3. Массивы и списки

Чем массив отличается от связного списка?

Массивы и списки

Массив хранит элементы в непрерывном блоке памяти и даёт доступ по индексу за O(1), а связный список — цепочка узлов с указателями, где вставка и удаление по известному узлу стоят O(1), но доступ по индексу — O(n).

Сравнение операций

  • Доступ по индексу: массив O(1), список O(n).
  • Вставка и удаление в начало: массив O(n) из-за сдвига, список O(1).
  • Вставка в конец: массив амортизированно O(1), список O(1) при хранении указателя на хвост.

Память и кеш процессора

  • Массив компактен и дружелюбен к кешу: элементы лежат рядом, prefetch работает.
  • Узел списка хранит лишний указатель и разбросан по куче: промахи кеша и больше памяти на элемент.

Когда список оправдан

Частые вставки и удаления по уже имеющемуся итератору на узел (как внутри LRU-кеша) либо когда нельзя перевыделять большой непрерывный блок памяти.

Коротко для собеседования

Массив выигрывает почти всегда: доступ по индексу за O(1) и плотное размещение, которое любит кеш процессора. Список берут, когда нужно много вставок и удалений по уже известному узлу, как в LRU-кеше; в остальных случаях его асимптотические плюсы съедаются промахами кеша.

Другие вопросы раздела