Разбиваемый стек

22

Что известно о структурах данных, которые могут поддерживать последовательность элементов, подлежащих следующим двум операциям?

  • Нажмите (x): добавьте x в конец последовательности и верните идентификатор для его позиции в последовательности
  • Извлечение (S): учитывая неупорядоченный набор идентификаторов, удалите элементы в этих позициях из последовательности и верните список удаленных элементов в порядке последовательности

Если вам нравится, вы можете думать об этом как о стеке или очереди с операцией разбиения, которая разбивает его на два стека: операция извлечения может использоваться для реализации операции pop или dequeue, а также может быть помещена извлеченная последовательность элементов. снова в другой стек или очередь.

Что я уже знаю: можно поддерживать последовательность в виде двусвязного списка, где каждый идентификатор является просто указателем на узел связанного списка, и каждый узел также хранит номер позиции, который позволяет быстро сравнивать позиции двух несвязанных элементов в последовательности. Нетрудно обновить номера позиций по мере развития структуры данных, чтобы все они представляли собой положительные целые числа максимального значения , где n - текущее количество элементов в списке. При такой структуре данных единственной сложной частью операции извлечения является сортировка извлеченных элементов по номерам позиций. Извлечение k предметов занимает O ( k O(n)nkожидаемое рандомизированное время с использованием, например, алгоритма целочисленной сортировки Хана и Торупа из FOCS 2002, а операция push занимает постоянное время.O(kloglogk)

Чего я не знаю: возможно ли обрабатывать извлечение за и выдвигать за постоянное время? Есть ли литература по этой проблеме? Это так же сложно, как целочисленная сортировка?O(k)

Мотивация: это основной шаг, необходимый для упорядочения элементов в алгоритме планирования Кофмана-Грэма, который также имеет приложения для построения графика. Трудная часть Коффмана-Грэма - это лексикографический топологический порядок. Это можно сделать, поддерживая для каждого отдельного уровня последовательность вершин с этим уровнем в подграфе, индуцированную оставшимися вершинами. Затем повторно удалите первую вершину из последовательности вершин с нулевой степенью и добавьте ее в топологический порядок; извлеките соседей v из степеней, которым они ранее принадлежали, и поместите их в последовательность для следующей меньшей степени. Так что O ( K )vvO(k) время для операций извлечения в этой структуре данных приведет к линейной реализации времени алгоритма Кофмана-Грэма.

С тех пор как я впервые спросил об этом, в 1976 году Сетхи нашел статью, которая позволяет реализовывать алгоритм Кофмана-Грэма за линейное время, и включил его в мою статью в Википедии об алгоритме Кофмана-Грэма , поэтому первоначальная мотивация менее значима. Мне все еще интересно, каков ответ, хотя.

Дэвид Эппштейн
источник
Если вставки выполняются только в конце последовательности, вы можете поддерживать как двойной связанный список, так и хеш-таблицу позиций элементов. Вставка: амортизированная O (1) (просто держите указатель на последний элемент). Извлечение k элементов: амортизированное O (k) (для каждого элемента S получить указатель и удалить его из хеш-таблицы, получить и удалить элемент из списка и добавить его в результат извлечения).
Марцио Де Биаси,
3
Это не извлечение элементов из списка, которое требует времени, это перестановка их из несортированного порядка аргумента для извлечения в правильный порядок последовательности.
Дэвид Эппштейн

Ответы:

1

Я думаю, что это, по крайней мере, так же сложно, как сортировка набора целых чисел со «случайным советом» полинома размера от n . Под случайным советом я подразумеваю, что для любого n существует фиксированное распределение D n (зависящее только от n ) по строкам размера poly ( n ), и нашему алгоритму (смоделированному на компьютере с ОЗУ) предоставляется произвольный доступ к одной выборке из D п . D n (рандомизированная) структура данных после нажатия [ n ]S[n]nnDnnnDnDn[n]в порядке, вместе с хэш-таблицей, которая отображает целые числа на идентификаторы в ожидаемое время .O(1)

Учитывая эту настройку, для экземпляра задачи целочисленной сортировки мы можем выдать extract ( S ) (на самом деле нам нужны идентификаторы S, но это отображение может быть выполнено за O ( 1 ) раз за элемент с использованием хеша таблица, которая является частью рекомендации) и входные данные будут отсортированы по времени, необходимому для выполнения извлечения.S[n]SSO(1)

Таким образом, сообщение заключается в том, что, если некоторая «свободная» дополнительная информация, которая зависит только от верхней границы целых чисел, не может упростить целочисленную сортировку, извлечение так же сложно, как целочисленная сортировка.

Означает ли это связь между двумя проблемами без странной модели? Известно ли это понятие случайного совета? Это похоже на протокол МА, но сообщение Мерлина не может зависеть от ввода, и мы заботимся о времени выполнения Артура.

Сашо Николов
источник
Нажатие на D п требует Ом ( п ) время, так что наличие свободного доступа к D п , как имеющие Ом ( п ) вычисление уже сделано в начале алгоритма. Поскольку вы можете отсортировать k целых чисел, извлеченных из [ n ] за O ( n + k ) , нет никаких оснований ожидать, что сортировка со свободным доступом к этой структуре данных займет больше времени O ( k ) . [n]DnΩ(n)DnΩ(n)k[n]O(n+k)O(k)
Дейв
Ω(n)DnkO(k)Dn
Вот причина, почему я не нахожу этот ответ полностью убедительным. Если у вас есть только один набор целых чисел S, который вы хотите отсортировать, все будет линейным временем (просто сделайте счет сортировки в O (n + k)). Но если вы пытаетесь использовать эту структуру данных для имитации последовательности множества небольших сортировок (так что сортировка при подсчете недостаточно хороша), то только первая из этих сортировок будет полностью без ограничений: после этого вы удалили некоторые элементов [n], поэтому каждая сортируемая вами последовательность должна отличаться от предыдущих. Таким образом, кажется, трудно сделать сокращение от сортировки.
Дэвид Эппштейн
O(k)O(n+k)
Ω(n)DnO(k)