Читая о forward_list
в FCD C ++ 11 и N2543 , я наткнулся на одну конкретную перегрузку splice_after
(слегка упрощенную и пусть cit
будет const_iterator
):
void splice_after(cit pos, forward_list<T>& x, cit first, cit last);
Поведение таково, что после pos
все, что находится между (first,last)
, перемещается в this
. Таким образом:
this: 1 2 3 4 5 6 x: 11 12 13 14 15 16
^pos ^first ^last
will become:
this: 1 2 13 14 3 4 5 6 x: 11 12 15 16
^pos ^first ^last
Описание включает в себя сложность:
Сложность: O (расстояние (первое, последнее))
Я вижу, что это потому, что нужно настроить PREDECESSOR(last).next = pos.next
, а forward_list
не позволяет этому произойти в O (1).
Хорошо, но не объединяет ли два односвязных списков в O (1) одну из сильных сторон этой простой структуры данных? Поэтому мне интересно - нет ли на * 1029 операции, которая склеивает / объединяет / объединяет произвольное количество элементов в O (1)?
Алгоритм, конечно, будет довольно простым. Нужно просто имя для операции (псевдокод): ( Обновлено путем интеграции ответа Kerreks)
temp_this = pos.next;
temp_that = last.next;
pos.next = first.next;
last.next = temp_this;
first.next = temp_that;
Результат немного другой, потому что перемещается не (first,last)
, а (first,last]
.
this: 1 2 3 4 5 6 7 x: 11 12 13 14 15 16 17
^pos ^first ^last
will become:
this: 1 2 13 14 15 16 3 4 5 6 7 x: 11 12 17
^pos ^last ^first
Я бы подумал, что это такая же разумная операция, как и предыдущая, которую люди хотели бы выполнить, особенно если она имеет преимущество в виде O (1).
- Я пропускаю операцию, которая является O (1) на многих элементах?
- Или мое предположение неверно, что
(first,last]
может быть полезен в качестве перемещаемого диапазона?
- Или есть ошибка в алгоритме O (1)?