Некоторое время я думал о следующей проблеме, и я не нашел ее полиномиального решения. Только грубая четверка. Я тоже пытался свести к этому проблему NP-Complete, но безуспешно.
Вот проблема :
У вас есть отсортированный набор пар целых положительных чисел.
Следующая операция может быть применена к паре: Swap(pair)
. Меняет местами элементы пары, поэтому станет
При замене пары в наборе набор автоматически снова сортируется (пара поменялась местами, и она будет перемещена на свое место в наборе).
Проблема состоит в том, чтобы увидеть, существует ли последовательность, которая, начиная с некоторой пары, заменяет весь набор со следующим условием:
После обмена пары следующая пара должна быть либо преемницей, либо предшествующей парой в наборе.
Было бы здорово найти решение этой проблемы за полиномиальное время или свести к нему задачу NP-Complete.
Примечание:
это уже проблема решения. Я не хочу знать, какая последовательность: только если последовательность существует.
Пример того, как набор сортируется после обмена пары
Если я поменяю местами первую пару, то получится: , и после сортировки набора (размещения отсортированной пары в новой позиции) мы получим:
Затем я должен поменять местами пару (предшественник) или (наследник) и повторять процесс, пока все пары не поменяются местами (если это возможно).
Важно:
вы не можете поменять местами уже обмененную пару.
Если существует последовательность операций подкачки, то все пары должны быть переименованы в один и только один раз.
Пример, где невозможно обменять все пары
источник
Ответы:
... Я искал некоторые шаблоны, чтобы построить сокращение от проблемы NPC, но не нашел способа представить «поток» с помощью «вилки» ...
Итак (после некоторой работы) это полиномиальный алгоритм ...
АЛГОРИТМ
Стартовый список можно рассматривать как массив из последовательных « дырок ». Для каждой начальной пары ( a j , b j ) поместите « элемент » b j в номер отверстия a j . Каждая пара может рассматриваться как направленный край от положения a j до положения b j . Шаг состоит в выборе элемента Ь J в положении J и перемещение его в положение назначения б JN∗2 (aj,bj) bj aj aj bj bj aj bj (отверстие назначения становится неподвижным колышком ). Мы удаляем ребро и продолжаем выбирать следующий ход, который начнется с одного из двух ближайших достижимых элементов из позиции b j ( разрешены только отверстия между b j и b k ). Мы должны найти последовательность из N последовательных ходов.bk bj bj bk N
Для каждого рассмотрим b j (в позиции массива a j ) как начальный элемент s t a r t .(aj,bj) bj aj start
Для каждого рассмотрим на K в качестве конечного элемента е н д (край от позиции к в положение б к будет конечный край).(ak,bk),ak≠aj ak end ak bk
Когда вы делаете ход, вы фиксируете колышек в позиции и массив разбивается на два раздела L (слева) и R (справа), и единственный способ перейти от L к R (или от R к L ) - это использовать край, который прыгает через колышек. Поставилbj L R L R R L
случаи:
А) если то один из двух разделов станет недоступным, остановите|flow|>1
Теперь предположим, что , т.е. e n d ∈ Rend>bj end∈R
B) если то слева слева направо есть дополнительное ребро, вы должны идти налево (выбрать ближайший элемент L ), иначе вы никогда не достигнете e n dflow=1 L end
C) если то есть дополнительное ребро справа налево, и какой бы узел вы ни выбрали, вы никогда не достигнете e n d , остановитесьflow=−1 end
D) если вы должны идти направо (выберите ближайший элемент R ), иначе вы никогда не достигнете e n dflow=0 R end
Если ( e n d ∈ L ), B, C, D инвертируются.end<bj end∈L
ПРИМЕЧАНИЕ: при перемещении влево или вправо, вы должны рассматривать как колышек. Например, если вы должны идти прямо, но ближайший элемент на R является е п д , то ход невозможно (и вы должны действовать с другой парой ( ы т г т , е п й ) )end R end (start,end)
Применяйте одно и то же звучание при каждом движении.
СЛОЖНОСТИ
Потоки через каждое отверстие могут быть предварительно рассчитаны в O (N) и использованы повторно при каждом сканировании.
Петли являются:
Во время вычислений выбор не сделан, поэтому сложность алгоритма равнаO(N3)
КОД
Это рабочая реализация алгоритма на Java:
источник
Это не решение, а переформулировка, которая позволяет избежать явного упоминания об операциях обмена и сортировки. Начните с сортировки всего объединенного списка имен файлов и их замененных версий и определите каждое имя файла с указателем в этом списке. Тогда два файла являются соседями, если все старые имена файлов между ними уже уничтожены, и если ни одно из новых имен файлов между ними еще не создано. Переформулированная проблема заключается в следующем:
источник