Ответ 1
Вы правы, статья рассматривает "Индексирование" как отдельную операцию. Таким образом, сама вставка O (1), но получение этой середины node равно O (n).
В соответствии с статьей Википедии о связанных списках, вставка в середине связанного списка считается O (1). Я бы подумал, что это будет O (n). Вам не нужно было бы найти node, который может быть ближе к концу списка?
Этот анализ не учитывает обнаружение операции node (хотя это необходимо) и просто сама вставка?
ИЗМЕНИТЬ:
Связанные списки имеют несколько преимуществ перед массивами. Вставка элемента в определенную точку списка - это операция с постоянным временем, тогда как для вставки в массив может потребоваться перемещение половины элементов или более.
Вышеприведенное утверждение немного вводит меня в заблуждение. Исправьте меня, если я ошибаюсь, но я думаю, что заключение должно быть:
Массивы:
Связанные списки:
Я думаю, что единственный раз, когда вам не нужно было бы находить позицию, это если у вас есть какой-то указатель на нее (как в случае с головой и хвостом в некоторых случаях). Поэтому мы не можем категорически заявить, что связанные списки всегда избивают массивы для вариантов вставки/удаления.
Вы правы, статья рассматривает "Индексирование" как отдельную операцию. Таким образом, сама вставка O (1), но получение этой середины node равно O (n).
Нет, когда вы решите, что хотите вставить, предполагается, что вы уже находитесь в середине итерации по списку.
Операции над связанными списками часто выполняются таким образом, что их на самом деле не рассматривают как общий "список", а как совокупность узлов - представьте, что сам узел является итератором для вашего основного цикла. Поэтому, просматривая список, вы замечаете, как часть своей бизнес-логики, что необходимо добавить новый узел (или удалить старый), и вы это делаете. Вы можете добавить 50 узлов за одну итерацию, и каждый из этих узлов - это всего лишь O (1) время, чтобы отсоединить два соседних узла и вставить новый.
Редактировать: Человек, вы набираете второй абзац и вдруг вместо того, чтобы быть первым респондентом, вы пятый говорит то же самое, что и первые 4!
Сама вставка - O (1). Node обнаружение O (n).
Для сравнения с массивом, на что указывает эта диаграмма, O (1), потому что вам не нужно перемещать все элементы после нового node.
Итак, они предполагают, что у вас уже есть указатель на этот node, или что получение указателя тривиально. Другими словами, проблема заключается в следующем: "учитывая node в X, каков код для вставки после этого node?" Вы можете начать с точки вставки.
Вставка в связанный список отличается от повторения по нему. Вы не находите элемент, вы переустанавливаете указатели, чтобы поместить элемент туда. Не имеет значения, будет ли он вставлен рядом с передним концом или ближе к концу, вложение по-прежнему включает переназначения указателей. Это будет зависеть от того, как это было реализовано, конечно, но это сила списков - вы можете легко вставить. Доступ через индекс - это то, где сияет массив. Однако для списка обычно будет O (n), чтобы найти n-й элемент. По крайней мере, это то, что я помню из школы.
Потому что это не связано с циклом.
Вставка выглядит так:
это постоянное время в любом случае.
Следовательно, вставка n элементов одна за другой - O (n).
Этот анализ не учитывает обнаружение операции node (хотя это необходимо) и просто сама вставка?
Вы поняли. Вставка в заданной точке предполагает, что у вас уже есть указатель на элемент, который вы хотите вставить после:
InsertItem(item * newItem, item * afterItem)
Вставка - это O (1), когда вы знаете, куда его поместить.
Нет, он не учитывает поиск. Но если у вас уже есть указатель на элемент в середине списка, вставка в эту точку - O (1).
Если вам нужно его искать, вам нужно добавить время поиска, которое должно быть O (n).
В статье рассказывается о сравнении массивов со списками. Поиск позиции вставки для обоих массивов и списков - O (N), поэтому статья игнорирует его.
O (1) зависит от того факта, что у вас есть элемент, в который вы будете вставлять новый элемент. (до или после). Если вы этого не сделаете, это O (n), потому что вы должны найти этот предмет.
Я думаю, что это всего лишь случай того, что вы выбираете для обозначения O(). В случае вставки нормальной операции для подсчета используются операции копирования. С массивом, вставка в середине предполагает копирование всего выше места в памяти. Со связанным списком это становится установкой двух указателей. Вам нужно найти местоположение независимо от того, что нужно вставить.
Если у вас есть ссылка на node для вставки после операции O (1) для связанного списка.
Для массива все равно O (n), поскольку вам нужно переместить все консекутивные узлы.
Наиболее распространенные случаи, вероятно, вставляются в начале или в конце списка (и конец списка может занять некоторое время, чтобы найти).
Контрастность с вставкой элементов в начале или в конце массива (что требует изменения размера массива, если оно в конце, или изменение размера и перемещение всех элементов, если оно происходит в начале).