Переупорядочить последовательность с минимальным количеством свопов, чтобы выполнить ограничения частичного порядка

Входные данные: массив элементов и частичный порядок подмножества этих элементов, рассматриваемый как набор ограничений.

Вывод: массив (или любая упорядоченная последовательность), удовлетворяющий частичному порядку.

Проблема: как можно эффективно изменить порядок? Количество введенных инверсий (или перестановок) по сравнению с исходной входной последовательностью должно быть как можно меньше. Обратите внимание, что частичный порядок может быть определен для любого количества элементов (некоторые элементы могут не входить в него).

Контекст: возникает из ситуации при уменьшении пересечения двухслойного графа: после фазы сокращения пересечения я хочу изменить порядок некоторых узлов (таким образом, частичный порядок может содержать только небольшое подмножество) .

В общем, у меня была идея немного ослабить это и решить задачу только для элементов, входящих в частичный порядок (хотя я думаю, что это могло привести к неоптимальным результатам). Таким образом, если у меня есть последовательность A B C D E, а частичный порядок содержит только A, B и E, то C и D останутся на одном месте. Это чем-то напоминает мне оценку Кемени, но я еще не мог превратить это в алгоритм.

Просто чтобы быть уверенным: я не ищу топологическую сортировку. Это, вероятно, приведет к гораздо большему количеству инверсий, чем требуется.

Редактировать 1:

  • Изменена формулировка (последовательность в массив).
  • Объем дополнительного пространства для решения задачи может быть сколь угодно (ну, полиномиально ограниченным) большим. Конечно, чем меньше, тем лучше :) Таким образом, что-то вроде O(ArrayLen*ArrayLen) самое большее было бы фантастическим.
  • Почему минимальное количество свопов или инверсий: поскольку эта процедура является частью сокращения пересечений, порядок входного массива (надеюсь) близок к оптимальному с точки зрения пересечений ребер со вторым слоем узлов. Тогда каждый дополнительный обмен или инверсия, вероятно, снова приведет к пересечению ребер. Но в процессе вычисления вывода количество сделанных перестановок или движений не очень важно (хотя, опять же, что-то линейное или квадратичное было бы круто), так как важно только качество вывода. Прямо сейчас я требую, чтобы ограничения были в общем порядке и проверяли только узлы этого порядка, поэтому решение становится тривиальным. Но ограничения частичного порядка были бы более гибкими.

person HansG    schedule 20.03.2016    source источник
comment
Итак, у вас есть массив, а не список? Например. Если у вас есть ABCDE и CEA с частичным порядком, то со списком наиболее эффективным было бы просто переместить A в конец.   -  person maraca    schedule 21.03.2016
comment
хорошая проблема. хотя немного ниже указанного. во-первых, термин «последовательность» расплывчатый (как видно из предыдущего комментария). это массив или список или какая-то другая структура данных? во-вторых, разрешено ли вам использовать дополнительную память (для чего-то вроде сортировки по сторонам, принятия решения о том, какие свопы сделать, а затем выполнения их в исходной последовательности)? в-третьих, зачем менять местами (хотя это может быть очевидно, если кто-то знаком с контекстом, а я нет)? а зачем минимизировать их количество, они дорогие?   -  person cobarzan    schedule 21.03.2016
comment
Фух, надо было дождаться ответов перед сном :) @maraca: В этом особом случае, возможно, это было бы хорошим решением. Но использовали ли вы какой-то эффективный алгоритм для ее решения?   -  person HansG    schedule 21.03.2016
comment
@cobarzan: Ответы в моем редактировании, спасибо.   -  person HansG    schedule 21.03.2016
comment
Я думаю, вы, вероятно, ищете топологическую сортировку или, по крайней мере, ее разновидность. Я бы предложил использовать обычную топологическую сортировку, но со следующей особенностью: всегда выбирать самую раннюю вершину, у которой нет предшественников. (Это означает использование приоритетной очереди вместо обычной DFS.)   -  person j_random_hacker    schedule 21.03.2016
comment
На самом деле, это звучит многообещающе. Я был настолько привязан к какому-то решению, связанному с Кемени, что полностью отказывался хотя бы рассматривать какие-либо варианты топологического типа. Буду разбираться дальше, спасибо!   -  person HansG    schedule 21.03.2016
comment
Не за что :) Кстати, если вы хотите, чтобы кто-то был уведомлен о вашем комментарии, укажите его имя пользователя, например: @j_random_hacker. (Заметьте, работает только для 1 комментария.)   -  person j_random_hacker    schedule 22.03.2016


Ответы (1)


Я нашел статью, которая выглядит многообещающе: «Быстрая и простая эвристика для ограниченного сокращения пересечения двух уровней» Майкла Фостера. Вместе с комментариями ниже моего вопроса на него дан ответ. Еще раз спасибо, @j_random_hacker!

person HansG    schedule 25.03.2016