Нет ли способа вставить в список STL за O (1) время?

#c #list #stl

#c #Список #stl

Вопрос:

Теоретически, вы должны иметь возможность вставлять в любое место списка (по выбранному вами индексу) за O (1) время. Но при использовании списка STL вам нужно вставить в позицию итератора, и, насколько я понимаю, позиция итератора должна быть увеличена O (n) раз, чтобы установить для нее нужный индекс. Я ошеломлен, почему так оно и есть, конечно, я ошибаюсь, и есть способ сделать это быстрее?

Комментарии:

1. Списки на самом деле не имеют индексов. Ваше понимание списка кажется в корне ошибочным. Возможно, вы хотите std::vector ?

2. A std::list — это список с двойной связью. Переход к N-му элементу O(N) похож на любой другой связанный список. Если у вас уже есть итератор в позицию, в которую вы хотите вставить новый элемент, тогда это O(1) .

3. Нет, вы неправильно поняли (хотя это распространенное недоразумение). С помощью связанного списка вы можете вставлять в позицию данного узла за постоянное время. Определение этого узла в среднем занимает линейное время.

4. Это может помочь устранить вашу путаницу, если вы попытаетесь самостоятельно создать список с нужным типом вставки. В какой-то момент вы застрянете, и именно этот момент будет ответом на ваш вопрос.

5. «Вставка в связанный список — это операция постоянного времени», похоже, одна из тех мантр, которые вы изучаете в начале своей карьеры, как раз перед тем, как забыть условия, при которых это верно. Вы можете найти недавнее видео Страуструпа в Интернете, где он делится своим удивлением по поводу того, насколько медленные случайные вставки списка сравниваются с вектором.

Ответ №1:

конечно, я ошибаюсь

Нет, вы не ошибаетесь.

и есть способ сделать это быстрее?

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