Перестановка двух строк формируется путем встраивания символов в новую строку, сохраняя символы каждой строки в порядке. Например, MISSISSIPPI
это перетасовка MISIPP
и SSISI
. Позвольте мне назвать строковый квадрат, если это тасование двух одинаковых строк. Например, ABCABDCD
квадратный, потому что это перетасовка ABCD
и ABCD
, но строка ABCDDCBA
не квадрат.
Существует ли быстрый алгоритм для определения того, является ли строка квадратной или NP-трудной? Очевидный подход динамического программирования, похоже, не работает.
Даже следующие особые случаи кажутся сложными: (1) строки, в которых каждый символ встречается не более четырех- шести раз, и (2) строки только с двумя разными символами. Как указывает Пер Острин ниже, частный случай, когда каждый персонаж встречается не более четырех раз, может быть уменьшен до 2SAT.
Обновление: у этой проблемы есть другая формулировка, которая может упростить проверку твердости.
Рассмотрим граф G, вершинами которого являются целые числа от 1 до n; идентифицировать каждое ребро с реальным интервалом между его конечными точками. Мы говорим, что два ребра G вложены, если один интервал правильно содержит другой. Например, ребра (1,5) и (2,3) являются вложенными, а (1,3) и (5,6) - нет, а (1,5) и (2,8) - нет. Совпадение в G не является вложенным, если нет пары ребер. Существует ли быстрый алгоритм для определения того, имеет ли G не вложенное идеальное соответствие, или эта проблема NP-трудная?
Отмена перестановки строки эквивалентна нахождению не вложенного идеального совпадения в непересекающемся объединении кликов (с ребрами между равными символами). В частности, отмена перестановки двоичной строки эквивалентна нахождению не вложенного идеального совпадения в непересекающемся объединении двух клик. Но я даже не знаю, сложна ли эта проблема для общих графов или для каких-либо интересных классов графов.
Существует простой алгоритм полиномиальное время , чтобы найти идеальный Непро- пересечения паросочетания.
Обновление (24 июня 2013 г.): проблема решена! Теперь есть два независимых доказательства того, что идентификация квадратных строк является NP-полной.
В ноябре 2012 года Сэм Бусс и Майкл Солтис объявили о сокращении с 3 разделов , что показывает, что проблема трудна даже для строк с алфавитом из 9 символов. См. «Разыгрывание квадрата - NP-Hard », Журнал Computer System Sciences 2014.
В июне 2013 года Ромео Рицци и Стефан Виалетт опубликовали сокращение от самой длинной общей проблемы подпоследовательности . См. « О распознавании слов, являющихся квадратами для случайного произведения », Proc. 8-й Международный симпозиум по информатике в России , Springer LNCS 7913, с. 235–245.
Существует также более простое доказательство того, что поиск не вложенных совершенных соответствий является NP-трудным, благодаря Шуай Ченг Ли и Мин Ли в 2009 году. См. « О двух открытых задачах 2-интервальных паттернов », Теоретическая информатика 410 (24–25). ): 2410–2423, 2009.
Ответы:
Майкл Солтис и я сумели доказать, что проблема определения возможности записи строки в виде квадратного тасования является NP-решением. Это применимо даже к конечному алфавиту с только различными символами, хотя наше доказательство написано для алфавита с 9 символами. Этот вопрос все еще открыт для небольших алфавитов, скажем, только с 2 символами. Мы не рассматривали проблему под ограничением, что каждый символ появляется только 6 раз (или, в более общем случае, постоянное число раз); так что этот вопрос все еще открыт.7 9 2 6
В доказательстве используется сокращение от части. Публикация здесь слишком длинна, но препринт «Отмена перемешивания строки - NP- hard» доступен на наших веб-страницах по адресу:3 NP
http://www.math.ucsd.edu/~sbuss/ResearchWeb/Shuffle/
а также
http://www.cas.mcmaster.ca/~soltys/#Papers .
Статья была опубликована в журнале компьютерных систем наук:
http://www.sciencedirect.com/science/article/pii/S002200001300189X
источник
Для особого случая, который вы упоминаете, когда каждый символ появляется максимум четыре раза, есть простое сокращение до 2-SAT (если я что-то упустил ...), как показано ниже:
Важным моментом является то, что для каждого персонажа существует (не более) двух допустимых способов сопоставления вхождений персонажа (третья возможность будет вложения). Используйте логическую переменную для представления, какое из двух совпадений выбрано. Теперь присваивание этим переменным дает правильное расстановку строк iff для каждой пары ребер, которые вложены, но не оба были выбраны. Это условие может быть точно описано дизъюнкцией переменных (возможно, с отрицанием), соответствующих двум задействованным символам.
источник
Вот алгоритм, который может иметь некоторые шансы быть правильным, хотя это сложно доказать, и я бы не стал ставить на это дом ...
Будем говорить , что будет очищен , если для каждого ребра е , существует (возможно , вложенная) совершенное соответствие G , который использует е и не использует край , содержащийся в или содержащие е .грамм е грамм е е
Легко проверить , очищен ли и не найдены ли нарушающие края. Ясно, что ни одно из этих нарушающих ребер не может быть использовано в идеальном сопоставлении без вложенности G , поэтому его можно исключить из рассмотрения. Повторяя этот процесс, мы получаем (единственный) очищенный подграф G, который имеет не вложенное совершенное совпадение, если G имеет.грамм грамм грамм грамм
Теперь наступает скачок веры, который может быть или не быть правильным: надежда состоит в том, что в очищенном графе, если все еще есть вершины степени , мы можем сделать жадный выбор и сопоставить первую такую вершину с ее первым соседом. (или, что то же самое, удалите ребра для всех остальных соседей).> 1
После жадного выбора мы снова очищаем график и т. Д., И процесс заканчивается, когда граф (надеюсь) не является идеальным соответствием без вложенности.
Сначала я подумал, что это будет похоже на небольшой взгляд в жадный алгоритм и не очень хорошо работает, но я обнаружил, что на удивление трудно найти контрпример.
источник
Решение, которое мы с Сэмом Буссом предложили в ноябре 2012 года (показывающее, что отмена квадрата в NP-hard путем сокращения с 3-х разделов) теперь является опубликованной статьей в журнале Computer System Sciences:
http://www.sciencedirect.com/science/article/pii/S002200001300189X
источник
Ромео Рицци и Стефан Виалетт доказывают, что распознавание квадратных строк является NP-завершенным в их статье 2013 года « О распознавании слов, являющихся квадратами для случайного произведения », путем сокращения из самой длинной проблемы двоичной подпоследовательности. Они утверждают, что сложность откатывания двоичных строк все еще открыта.
Еще более простое доказательство того, что нахождение не вложенного идеального соответствия является NP-полным, даны Шуай Ченг Ли и Мин Ли в их статье 2009 года « О двух открытых задачах 2-интервальных паттернов ». Однако они используют терминологию, унаследованную от биоинформатики. Вместо «идеального не вложенного соответствия» они называют это « проблемой DIS-2-IP-{<,≬} ». Эквивалентность между этими двумя проблемами описана Блиным, Фертином и Виалеттой :
Обновление (25 февраля 2019 г.): Булто и Виалетт показали, что проблема решения проблемы перетасовки двоичной строки в их статье является NP-полной. Распознавание двоичных квадратов тасования является NP-сложной задачей .
источник
Это помогает?
http://users.soe.ucsc.edu/~manfred/pubs/J1.pdf
источник
НИКОГДА НЕ НАМ, ЭТО ОТВЕТ НЕПРАВИЛЬНЫЙ. Ошибка при вводе «AABAAB»: жадное сопоставление первых двух букв A делает невозможным сопоставление оставшихся символов. Я оставляю это, а не удаляю это, чтобы помочь другим избежать той же самой ошибки.
Мне кажется, что всегда безопасно сопоставлять каждый последующий символ предполагаемого квадрата с другим равным символом, который находится на как можно более ранней позиции. То есть, я думаю, что следующий алгоритм линейного времени должен работать:
Перебрать каждую позицию i во входной строке, i = 0, 1, 2, ... n. Для каждой позиции i проверьте, сопоставлена ли уже эта позиция с какой-либо более ранней позицией в строке. Если нет, сопоставьте его с равным символом, который следует за последней уже найденной позицией и в противном случае находится как можно раньше в строке. Если совпадение не найдено для какого-либо символа, объявите, что ввод не является квадратом; в противном случае это набор символов в первой паре каждого совпадения.
Вот это в Python:
Здесь i - переменная основного цикла (позиция, которую мы пытаемся сопоставить), j - указатель на массив совпадающих пар, который ускоряет проверку того, совпадает ли позиция i, и k - индекс, используемый для поиска символ, который соответствует одному в позиции i. Это линейное время, потому что i, j и k монотонно растут по строке, и каждая итерация внутреннего цикла увеличивает одну из них.
источник
Обновление: не имеет смысла говорить о сложности поиска идеального соответствия, которое не является вложенным и не пересекается, когда метки имеют значение от 1 до n, потому что есть только один такой. (Да, бьюсь о себе.) Однако, это имеет смысл, учитывая больший диапазон на этикетках ... так что я все еще вижу некоторую надежду, но это может быть совершенно бессмысленным в конце концов. Я, конечно, должен был бы продолжить это еще немного.
Я могу думать о том, почему может быть трудно найти соответствие, которое не является вложенным и не пересекается. Позвольте мне назвать такое соответствие непересекающимся соответствием . Не уверен, насколько это помогает, но позвольте мне представить обоснование в любом случае. (Я должен отметить, что мой аргумент в том виде, в котором он здесь представлен, не является полным, и детали, которые я опускаю, возможно, имеют решающее значение. Однако я полагаю, что это может быть чем-то вроде начала.)
Чтобы избавиться от цветов и сделать идеальное совпадение, хотя и в более широком диапазоне , внесите следующие изменения в созданный таким образом график:
[1] О задачах без полиномиальных ядер , Ханс Л. Бодлендер, Родни Г. Дауни, Майкл Р. Феллоуз и Дэнни Хермелин, Дж. Компут. Сист. Sci.
источник
Подход не работает: декомпозиция перетасованного квадрата путем извлечения двух совпадающих букв не приводит к перетасовыванию квадратов ... См. Комментарии Раду ниже.
источник
Обновить: Как отмечает Цуёси Ито в комментариях, этот алгоритм имеет экспоненциальное время выполнения.
Исходное сообщение:
Вот как я бы запрограммировал это в реальном мире.
Нам дана строка S = (S [1], ..., S [n]). Для каждого префикса S_r = (S [1], ..., S [r]) существует набор {(T_i, U_i)} пар строк, такой, что S_r является случайным образом (T_i, U_i), и T_i является префиксом U_i (то есть U_i 'начинается с' T_i). Сам S_r является квадратом тогда и только тогда, когда этот набор содержит пару (T_i, U_i) с T_i = U_i.
Теперь нам не нужно генерировать все эти пары; нам просто нужно сгенерировать суффикс V_i каждой строки U_i, полученной путем удаления ее копии T_i. Это исключит (возможно, экспоненциальное) количество ненужных дубликатов. Теперь S_r является квадратом тогда и только тогда, когда этот набор суффиксов содержит пустую строку. Таким образом, алгоритм становится:
Например, если S является AABAAB:
Мы можем отбросить все суффиксы, длина которых превышает половину входной строки, поэтому это упрощается до:
Я запрограммировал это на C ++, и это работает на всех приведенных здесь примерах. Я могу опубликовать код, если кому-то интересно. Вопрос в том, может ли размер SuffixSet расти быстрее, чем полиномиально?
источник
РЕДАКТИРОВАТЬ: Это неправильный ответ.
Сильвен предложил RCG, который, к сожалению, не подходит для этих «случайных квадратов». Тем не менее, я думаю, что есть один (РЕДАКТИРОВАТЬ: не RCG, см. Комментарии Курта ниже!) , Который выглядит следующим образом:
Объяснение: напомним, что мы должны сопоставлять символы, которые могут появляться в любом месте строки, но как только мы сопоставимa a' б б' a ≺ b a'≺ б' ≺ ( 1 , 2 ) ( 3 ) ( 2 ) и посмотреть, есть ли совпадение в более поздней позиции. Важно то, что это разрешено только в одном направлении!
Я не разработал формального доказательства того, что эта грамматика действительно отражает именно «случайные квадраты», но это не должно быть слишком сложно. Сильвен уже упоминал, что проблема решения для RCGs является полиномиальной.
источник