Почему вставка в середине связанного списка O (1)?

В соответствии с статьей Википедии о связанных списках, вставка в середине связанного списка считается O (1). Я бы подумал, что это будет O (n). Вам не нужно было бы найти node, который может быть ближе к концу списка?

Этот анализ не учитывает обнаружение операции node (хотя это необходимо) и просто сама вставка?

ИЗМЕНИТЬ:

Связанные списки имеют несколько преимуществ перед массивами. Вставка элемента в определенную точку списка - это операция с постоянным временем, тогда как для вставки в массив может потребоваться перемещение половины элементов или более.

Вышеприведенное утверждение немного вводит меня в заблуждение. Исправьте меня, если я ошибаюсь, но я думаю, что заключение должно быть:

Массивы:

  • Поиск точки вставки/удаления O (1)
  • Выполнение вставки/удаления O (n)

Связанные списки:

  • Поиск точки вставки/удаления O (n)
  • Выполнение вставки/удаления O (1)

Я думаю, что единственный раз, когда вам не нужно было бы находить позицию, это если у вас есть какой-то указатель на нее (как в случае с головой и хвостом в некоторых случаях). Поэтому мы не можем категорически заявить, что связанные списки всегда избивают массивы для вариантов вставки/удаления.

Ответ 1

Вы правы, статья рассматривает "Индексирование" как отдельную операцию. Таким образом, сама вставка O (1), но получение этой середины node равно O (n).

Ответ 2

Нет, когда вы решите, что хотите вставить, предполагается, что вы уже находитесь в середине итерации по списку.

Операции над связанными списками часто выполняются таким образом, что их на самом деле не рассматривают как общий "список", а как совокупность узлов - представьте, что сам узел является итератором для вашего основного цикла. Поэтому, просматривая список, вы замечаете, как часть своей бизнес-логики, что необходимо добавить новый узел (или удалить старый), и вы это делаете. Вы можете добавить 50 узлов за одну итерацию, и каждый из этих узлов - это всего лишь O (1) время, чтобы отсоединить два соседних узла и вставить новый.

Редактировать: Человек, вы набираете второй абзац и вдруг вместо того, чтобы быть первым респондентом, вы пятый говорит то же самое, что и первые 4!

Ответ 3

Сама вставка - O (1). Node обнаружение O (n).

Ответ 4

Для сравнения с массивом, на что указывает эта диаграмма, O (1), потому что вам не нужно перемещать все элементы после нового node.

Итак, они предполагают, что у вас уже есть указатель на этот node, или что получение указателя тривиально. Другими словами, проблема заключается в следующем: "учитывая node в X, каков код для вставки после этого node?" Вы можете начать с точки вставки.

Ответ 5

Вставка в связанный список отличается от повторения по нему. Вы не находите элемент, вы переустанавливаете указатели, чтобы поместить элемент туда. Не имеет значения, будет ли он вставлен рядом с передним концом или ближе к концу, вложение по-прежнему включает переназначения указателей. Это будет зависеть от того, как это было реализовано, конечно, но это сила списков - вы можете легко вставить. Доступ через индекс - это то, где сияет массив. Однако для списка обычно будет O (n), чтобы найти n-й элемент. По крайней мере, это то, что я помню из школы.

Ответ 6

Потому что это не связано с циклом.

Вставка выглядит так:

  • элемент вставки
  • ссылка на предыдущий
  • ссылка на следующий
  • сделано

это постоянное время в любом случае.

Следовательно, вставка n элементов одна за другой - O (n).

Ответ 7

Этот анализ не учитывает обнаружение операции node (хотя это необходимо) и просто сама вставка?

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

InsertItem(item * newItem, item * afterItem)

Ответ 8

Вставка - это O (1), когда вы знаете, куда его поместить.

Ответ 9

Нет, он не учитывает поиск. Но если у вас уже есть указатель на элемент в середине списка, вставка в эту точку - O (1).

Если вам нужно его искать, вам нужно добавить время поиска, которое должно быть O (n).

Ответ 10

В статье рассказывается о сравнении массивов со списками. Поиск позиции вставки для обоих массивов и списков - O (N), поэтому статья игнорирует его.

Ответ 11

O (1) зависит от того факта, что у вас есть элемент, в который вы будете вставлять новый элемент. (до или после). Если вы этого не сделаете, это O (n), потому что вы должны найти этот предмет.

Ответ 12

Я думаю, что это всего лишь случай того, что вы выбираете для обозначения O(). В случае вставки нормальной операции для подсчета используются операции копирования. С массивом, вставка в середине предполагает копирование всего выше места в памяти. Со связанным списком это становится установкой двух указателей. Вам нужно найти местоположение независимо от того, что нужно вставить.

Ответ 13

Если у вас есть ссылка на node для вставки после операции O (1) для связанного списка.
Для массива все равно O (n), поскольку вам нужно переместить все консекутивные узлы.

Ответ 14

Наиболее распространенные случаи, вероятно, вставляются в начале или в конце списка (и конец списка может занять некоторое время, чтобы найти).

Контрастность с вставкой элементов в начале или в конце массива (что требует изменения размера массива, если оно в конце, или изменение размера и перемещение всех элементов, если оно происходит в начале).