Что известно о структурах данных, которые могут поддерживать последовательность элементов, подлежащих следующим двум операциям?
- Нажмите (x): добавьте x в конец последовательности и верните идентификатор для его позиции в последовательности
- Извлечение (S): учитывая неупорядоченный набор идентификаторов, удалите элементы в этих позициях из последовательности и верните список удаленных элементов в порядке последовательности
Если вам нравится, вы можете думать об этом как о стеке или очереди с операцией разбиения, которая разбивает его на два стека: операция извлечения может использоваться для реализации операции pop или dequeue, а также может быть помещена извлеченная последовательность элементов. снова в другой стек или очередь.
Что я уже знаю: можно поддерживать последовательность в виде двусвязного списка, где каждый идентификатор является просто указателем на узел связанного списка, и каждый узел также хранит номер позиции, который позволяет быстро сравнивать позиции двух несвязанных элементов в последовательности. Нетрудно обновить номера позиций по мере развития структуры данных, чтобы все они представляли собой положительные целые числа максимального значения , где n - текущее количество элементов в списке. При такой структуре данных единственной сложной частью операции извлечения является сортировка извлеченных элементов по номерам позиций. Извлечение k предметов занимает O ( k √ожидаемое рандомизированное время с использованием, например, алгоритма целочисленной сортировки Хана и Торупа из FOCS 2002, а операция push занимает постоянное время.
Чего я не знаю: возможно ли обрабатывать извлечение за и выдвигать за постоянное время? Есть ли литература по этой проблеме? Это так же сложно, как целочисленная сортировка?
Мотивация: это основной шаг, необходимый для упорядочения элементов в алгоритме планирования Кофмана-Грэма, который также имеет приложения для построения графика. Трудная часть Коффмана-Грэма - это лексикографический топологический порядок. Это можно сделать, поддерживая для каждого отдельного уровня последовательность вершин с этим уровнем в подграфе, индуцированную оставшимися вершинами. Затем повторно удалите первую вершину из последовательности вершин с нулевой степенью и добавьте ее в топологический порядок; извлеките соседей v из степеней, которым они ранее принадлежали, и поместите их в последовательность для следующей меньшей степени. Так что O ( K ) время для операций извлечения в этой структуре данных приведет к линейной реализации времени алгоритма Кофмана-Грэма.
С тех пор как я впервые спросил об этом, в 1976 году Сетхи нашел статью, которая позволяет реализовывать алгоритм Кофмана-Грэма за линейное время, и включил его в мою статью в Википедии об алгоритме Кофмана-Грэма , поэтому первоначальная мотивация менее значима. Мне все еще интересно, каков ответ, хотя.