Изменения в связанном списке включают две операции:
- местонахождение узел для добавления нового узла
- фактически Добавляя узел, изменяя узел указателей
В Linked List, вторая операция - операция O(1)
, так что это вопрос стоимости первых операций.
При добавлении к последнему узлу наивные реализации связанного списка приведут к времени итерации O(n)
. Тем не менее, хорошие библиотеки связанных списков будут учитывать наиболее распространенные виды использования и специальный случай доступа к последнему узлу. Эта оптимизация приведет к извлечению последнего элемента в O(1)
, в результате чего общее время ввода будет установлено O(1)
.
Что касается середины, то ваш анализ правилен тем, что расположение узла также будет принимать O(n)
. Однако некоторые библиотеки выставляют метод, который будет содержать указатель на то, где должен быть вставлен новый узел, а не индекс (например, C++
list
). Это устраняет линейные затраты, в результате чего получается все O(1)
.
В то время как вставка в середину обычно считается операцией O(n)
, в некоторых случаях ее можно оптимизировать до O(1)
.Это противоположно списку массивов, где сама операция вставки (вторая операция) равна O(n)
, так как все элементы в более высоких местах необходимо переместить. Эта операция не может быть оптимизирована.
Для вставки Наивная реализация связанного списка приведет к O(n)
времени ввода. Тем не менее, хорошие разработчики библиотек связанных списков будут оптимизированы для обычных случаев, поэтому они будут ссылаться на последние элементы (или иметь реализацию циклического связанного списка), в результате чего время вставки O(1)
.
Что касается вставки в центр. В некоторых библиотеках, таких как C++
, есть рекомендуемое место для вставки. Они возьмут указатель на узел списка, к которому добавляется новый. Такие вставки будут стоить O(1)
. Я не думаю, что вы можете достичь O(1)
по номеру индекса.
Это относится к списку массивов, в котором вставка в средние значения переупорядочивает все элементы, превышающие его, поэтому это должно быть операция O(n)
.
Если вставка в середине списка была O (1), нам больше не нужны массивы :). – Li0liQ
Li0liQ: Одно из преимуществ связанных списков состоит в том, что вы можете вставлять элементы посередине в постоянное время, когда в массивах вам нужно переместить все следующие элементы. – Amnon
@ Li0liQ: Как насчет постоянного индексирования времени? – sykora