Нет операции O (1) для соединения элементов из двух forward_lists?

Читая о forward_list в FCD C ++ 11 и N2543 Я наткнулся на одну конкретную перегрузку splice_after (немного упрощен, и пусть cit будет const_iterator ):

void splice_after(cit pos, forward_list& x, cit first, cit last);

Поведение таково, что после pos все между (первый, последний) перемещается в 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 (расстояние (первый, последний))

Я вижу, что это связано с тем, что нужно настроить ПРЕДЕЦЕССОР (последний) .next = pos.next , и forward_list не позволяет этому случиться в O (1).

Хорошо, но разве объединение двух односвязных списков в O (1) не является одной из сильных сторон этой простой структуры данных? Поэтому мне интересно - нет ли операции с forward_list , которая соединяет / объединяет / соединяет произвольное количество элементов в O (1)?

Конечно, алгоритм был бы довольно простым. Достаточно просто указать имя для операции (псевдокод): ( Обновлено путем интеграции ответа Керрекса)

temp_this  =   pos.next;
temp_that  =  last.next;
  pos.next = first.next;
 last.next =  temp_this;
first.next =  temp_that;

Результат немного другой, потому что не (первый, последний) перемещен, но (первый, последний] .

  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) для многих элементов?
  • Или мое предположение неверно, что (первый, последний] может быть полезен в качестве перемещенного диапазона?
  • Или есть ошибка в алгоритме O (1)?

19
задан towi 10 October 2011 в 15:34
поделиться