Нахождение интересных анаграмм


31

Скажем, что и b 1 b 2b n - две строки одинаковой длины. Anagramming из двух строк является взаимно однозначное отображение р : [ 1 ... п ] [ 1 ... п ] такое , что я = Ь р ( я ) для каждого I .a1a2anb1b2bnp:[1n][1n]ai=bp(i)i

Для одной пары строк может быть несколько анаграмм. Например, если `abcab` и b =, мы имеем p 1 [ 1 , 2 , 3 , 4 , 5 ] [ 4 , 5 , 1 , 2 , 3 ] и p 2 [ 1 , 2 , 3 , 4 , 5 ] [ 2 , 5 , 1a=b=cababp1[1,2,3,4,5][4,5,1,2,3] , среди прочих.p2[1,2,3,4,5][2,5,1,4,3]

Мы скажем, что вес анаграммирования p - это количество срезов, которые нужно сделать в первой строке, чтобы получить куски, которые можно переставить, чтобы получить вторую строку. Формально это число значений i [ 1 n - 1 ], для которых p ( i ) + 1 p ( i + 1 ) . То есть, это количество точек , в которых р вовсе не увеличивает ровно 1.For например, ш ( рw(p)pi[1n1]p(i)+1p(i+1)p и w ( p 2 ) = 4 , потому что p 1 разрезаетодин раз на кускии, а p 2 разрезаетчетыре на пять кусков.w(p1)=1w(p2)=4p11234512345p212345

Предположим, что существует анаграммирование для двух строк и b . Тогда хотя бы одно анаграммирование должно иметь наименьший вес. Скажем так, этот самый легкий . (Может быть несколько самых легких анаграммингов; мне все равно, потому что меня интересуют только веса.)ab

Вопрос

Я хочу алгоритм, который, учитывая две строки, для которых существует анаграммирование, эффективно дает точный вес самого легкого анаграммирования двух строк. Это нормально, если алгоритм также дает легчайшее анаграммирование, но это не обязательно.

Довольно просто сгенерировать все анаграммы и взвесить их, но их может быть много, поэтому я бы предпочел метод, который напрямую находит анаграммы света.


мотивация

Причина, по которой эта проблема представляет интерес, заключается в следующем. Очень легко заставить компьютер искать в словаре и находить анаграммы, пары слов, которые содержат одинаковые буквы. Но многие из произведенных анаграмм неинтересны. Например, самые длинные примеры, которые можно найти во Втором международном словаре Вебстера:

холецистодуоденостомия
дуоденохолецистостомия

Проблема должна быть ясно: это неинтересно , потому что они допускают очень легкий anagramming , что просто обменивает cholecysto, duedenoи stomyсекции, для веса 2. С другой стороны, это намного короче пример гораздо более удивительным и интересным:

береговая линия в
разрезе

Здесь самый легкий анаграмминг имеет вес 8.

У меня есть программа, которая использует этот метод для поиска интересных анаграмм, а именно тех, для которых все анаграммы имеют большой вес. Но он делает это, генерируя и взвешивая все возможные анаграммы, что очень медленно.


Просто из любопытства, как вы находите пары анаграмм? Делаете ли вы поиск методом грубой силы во всех словах одинаковой длины? O(n2)
Педро

4
Нет, конечно нет. Вы преобразуете каждое слово в каноническую форму с одинаковыми буквами в алфавитном порядке. (Например, каноническая форма cholecystoduodenostomyis ccddeehlmnooooossttuyy.) Два слова являются анаграммами тогда и только тогда, когда они имеют одинаковую каноническую форму. Вы сохраняете слова в хеш-таблице, обозначенные их каноническими формами, и всякий раз, когда вы обнаруживаете столкновение, у вас появляется анаграмма.
Марк Доминус

Теперь у меня есть много более или менее связанной информации об этом в моем блоге: (α) (β) (γ) (δ)
Марк Доминус

Ответы:


21

Эта проблема известна как «проблема минимального общего разделения строк». (Точнее, ответ в задаче минимального общего разделения строк равен ответу в вашей задаче плюс 1). К сожалению, это NP-сложный, даже с ограничением, которое каждая буква встречается не более двух раз в каждой из входных строк, что доказано Гольдштейном, Килманом и Чжэн [GKZ05]. Это означает, что никакого алгоритма полиномиального времени не существует, если P = NP. (Конечно, если каждая буква встречается не более одного раза, тогда проблема тривиальна, потому что есть только одно анаграммирование.)

С другой стороны, те же авторы [GKZ05] приводят алгоритм полиномиального времени в 1.1037-приближении с тем же ограничением. («Алгоритм аппроксимации 1.1037 » означает алгоритм, который может не выводить правильный ответ A, но гарантированно выдает значение B такое, что AB ≤ 1.1037 A. ) Они также дают алгоритм 4-аппроксимации линейного времени под Более слабое ограничение: каждая буква встречается не более трех раз в каждой из входных строк.

[GKZ05] Авраам Гольдштейн, Петр Колман и Цзе Чжэн. Минимальная общая проблема разбиения строки: твердость и приближения. Электронный журнал комбинаторики , 12, статья R50, 2005. http://www.combinatorics.org/ojs/index.php/eljc/article/view/v12i1r50



9

Это продолжение ответа Цуёси Ито, приведенного выше , резюмируя наиболее релевантную часть статьи GKZ05, которую он цитировал.

G(i,j)ai=bjai+1=bj+1(i,j)(k,)ikiji+1j+1kk+1+1

  1. i=kj
  2. i+1=kj+1
  3. i+1<k{j,j+1}{,+1}

Gsns1nabG

yttrioustouristyouriououriris=2y|t|t|ri|ou|st|ou|ri|s|t|y

С другой стороны, рассмотрим deraterи treader. На этот раз у графа есть три вершины:

  1. DErater + treaDEr
  2. dERater + treadER
  3. deratER + treadER

s=2der|a|t|e|rt|r|e|a|der


2
Спасибо за последующий пост, но это не доказательство NP-полноты вашей проблемы. Чтобы доказать NP-полноту вашей проблемы, вы должны свести к своей проблеме некоторую известную NP-полную проблему, а это теорема 2.2 из [GKZ05]. То, что вы представили здесь (лемма 1.1 из [GKZ05]), является сокращением в обратном направлении.
Цуёси Ито

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

2

Он не охватывает точный алгоритм, который вы имели в виду (что делает ответ Цуёси Ито ), но пытается решить основную проблему поиска «интересных» анаграмм ...

Моей первой мыслью было использование некоторого изменения расстояния редактирования, когда атомные изменения взвешиваются в соответствии с их «интересностью», а не с обычными весами «сложность» или «путаница». Конечно, кажется маловероятным, что вы сможете эффективно кодировать действительно интересные преобразования таким образом, поскольку они, вероятно, будут нелокальными и, следовательно, сталкиваются с проблемами MIS и т. Д. И т. Д.

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

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


0

Задача может быть сформулирована в терминах групп перестановок .

Теперь группа перестановок содержит все «ходы анаграммы», как примитивные (смена двух букв), так и совокупность последовательностей примитивных ходов. Кажется, что вы заинтересованы только в подмножестве возможных перестановок. Я попытаюсь определить это.

Сначала вспомним обозначение для перестановок, а именно так называемое обозначение цикла :

  • ()
  • (1)
  • (12)
  • (123)
  • и так один

Эти простые «циклы» составлены для описания более сложных перестановок.

n

  • (12)
  • (a b)(a+1 b+1)a>0b<a+1b+1n
  • ...
  • (a b)(a+1 b+1)(a+i1 b+i1)a>0a+i1bb+i1n

Эти шаги формируют основу для вашего алгоритма. Что вас интересует, так это нахождение наименьшей последовательности этих движений для перехода от одного слова к другому.

Я не знаю ни одного алгоритма для вычисления этого, кроме поиска методом грубой силы, но, по крайней мере, сейчас есть более четкое (я надеюсь) описание того, что представляют собой примитивные движения. (И, может быть, какой-нибудь теоретик группы среди нас может указать на соответствующий алгоритм.)


1
Спасибо. Возможно, я настроен пессимистично, но мне кажется, что такой подход будет сложным. Я не думаю, что теоретико-групповой подход принесет свои плоды, если мы сначала не выясним, какая группа перестановок представляет интерес, и она меняется в зависимости от входных строк. Я думаю, что эффективное представление конечных групп является чрезвычайно глубокой и богатой проблемой. Но я бы хотел ошибиться.
Марк Доминус

1
«Что вас интересует, так это нахождение наименьшей последовательности этих шагов для перехода от одного слова к другому». Я не думаю, что это правильно. Например, если n = 4, своп (1 2) имеет вес 2, а своп (2 3) имеет вес 3. Ваш способ подсчета не различает эти два.
Цуёси Ито

Я ответил поздно ночью. Я не правильно поняла вес. На самом деле, я не понимаю этого сейчас. Я думал, что вы хотели разрешить перемещение блоков букв, вот почему я приложил все усилия для определения этих примитивов. Мой ответ может послужить источником вдохновения, поэтому я оставлю его, хотя он и неправильный.
Дэйв Кларк

0

Что касается холецистодуоденостомии / дуоденохолецистостома, я заметил, что если бы вы присвоили число каждому персонажу, описывающее, насколько оно было перемещено как дельта, у вас было бы что-то вроде 7 7, затем 8 -7 с, затем 6 0. Это не правильно, потому что некоторые символы могли повторяться (второй c двигался только вперед 2, а не назад 7) и т. Д., Но все еще очень «кодируемо по длине бега», потому что вы видите одни и те же дельты подряд.

Сравните с береговой линией / разрезом, где вы видите что-то вроде (+2) (+ 5) (+ 5) (- 3) (- 1) (+ 3) .... намного меньше "кодируемой длины пробега".

Возможно, случайность дельт может дать вам «оценку» того, насколько интересна анаграмма?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.