PRO

Что такое массив и связный список? В чём разница по O-сложности операций?

Массив хранит элементы последовательно и позволяет быстро получить значение по индексу. Связный список состоит из узлов со ссылками на следующие элементы: вставка и удаление известного узла выполняются быстро, но поиск и доступ по индексу требуют прохода по списку.
Подробный ответ

Что такое массив

Массив — структура данных с последовательным хранением элементов. Благодаря этому можно быстро обратиться к элементу по индексу.

items = [10, 20, 30]
value = items[1]

Доступ к items[1] обычно имеет сложность O(1).

Что такое связный список

Связный список состоит из узлов. Каждый узел содержит значение и ссылку на следующий узел. В двусвязном списке есть ссылки и на предыдущий, и на следующий узел.

class Node:
    def __init__(self, value, next_node=None):
        self.value = value
        self.next = next_node

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

ОперацияМассивСвязный список
Доступ по индексуO(1)O(n)
Поиск элементаO(n)O(n)
Вставка в началоO(n)O(1)
Удаление из началаO(n)O(1)
Вставка после известного узлаO(n)O(1)
Добавление в конецОбычно амортизированно O(1)O(1) при ссылке на tail, иначе O(n)

Почему вставка в массив может быть O(n)

Если вставить значение в начало или середину массива, нужно сдвинуть элементы справа, чтобы освободить место. В связном списке достаточно изменить ссылки соседних узлов, если нужная позиция уже известна.

Когда что выбирать

Массив подходит, когда нужен быстрый доступ по индексу и хорошая локальность данных в памяти. Связный список может быть удобен при частых вставках и удалениях в известных позициях, но на практике часто уступает массивам из-за дополнительной памяти на ссылки и плохой cache locality.

Как ответить на собеседовании

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

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге