Вопрос

Скажите, что $ a_1a_2 ldots a_n $ и $ b_1b_2 ldots b_n $ - две строки одинаковой длины. Атмосфера Анаграмирование из двух строк - это биктивное отображение $ p: [1 ldots n] to [1 ldots n] $ такая, что $ a_i = b_ {p (i)} $ для каждого $ i $.

Там может быть более одного анаграмма для той же пары струн. Например, если $ a = $ `abcab` и $ b = $cabab У нас есть $ P_1 [1,2,3,4,5] до [4,5,1,2,3] $ и $ P_2 [1,2,3,4,5] до [2,5, 1,4,3] $, среди прочих.

Мы скажем, что масса $ w (p) $ of anagramming $ p $ - это количество сокращений, которые необходимо сделать в первой строке, чтобы получить куски, которые можно переставить, чтобы получить вторую строку. Формально это количество значений $ i in [1 ldots n-1] $, для которых $ p (i) +1 ne p (i+1) $. То есть это количество очков, на которых делает $ p $ нет Увеличьте ровно на 1. Например, $ w (p_1) = 1 $ и $ w (p_2) = 4 $, потому что $ p_1 $ cuts 12345 Однажды, в куски 123 а также 45, и $ p_2 $ сокращения 12345 Четыре раза, в пять кусков.

Предположим, что существует анаграммы для двух строк $ a $ и $ b $. Затем, по крайней мере, у одного анаграммы должно быть наименьший вес. Допустим, это это самый легкий. Анкет (Там может быть несколько самых легких анагромов; мне все равно, потому что меня интересует только веса.)

Вопрос

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

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


Мотивация

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

холецистодуоденостомия
двенадцатиперстная кишка

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Это продолжение Tsuyoshi Ito's Ответ выше, суммирование наиболее актуальной части GKZ05 бумага он процитировал.

Документ доказывает сокращение максимального независимого набора (Мимо) проблема. Построить график $ g $, вершины которых являются парами $ (i, j) $ так, что $ a_i = b_j $ и $ a_ {i+1} = b_ {j+1} $. Подключите вершины $ (i, j) $ и $ (k, ell) $ (где $ i≤k $) с преимуществом всякий раз, когда невозможно, чтобы анаграммирование могло отобразить все $ i mapsto j $ и $ i+ 1 mapsto j+1 $ и $ k mapsto ell $ и $ k+1 mapsto ell+1 $. Это легко обнаружить; Такое отображение невозможно точно, если одно из следующих

  1. $ i = k $ и $ j ne ell $
  2. $ i+1 = k $ и $ j+1 ne ell $
  3. $ i+1

Скажем, полученный график $ G $ имеет максимальный независимый набор размеров $ S $. Тогда минимальный вес анаграммирования-$ NS-1 $, где $ n $-это продолжительность струн $ A $ и $ B $. (Конверс также содержит: анаграммирование низкого веса переводится непосредственно в большой MIS для $ G $. Для получения подробной информации см. Стр. 4–5 бумаги.)

Например, рассмотрим две строки yttrious а также touristy. Анкет Соответствующий график имеет две вершины, одна для общих ou пара и один для общего ri пара. Между вершинами нет преимущества, потому что можно иметь анаграмму, которое отображает оба ou к ou а также ri к ri; Или можно проверить, что три условия, прежде всего, терпят неудачу. Таким образом, график, очевидно, имеет неправильный размер $ s = 2 $, а минимальный вес анаграммирования действительно 8-2-1 = 5, что соответствует анаграмму y|t|t|ri|ou|st|ou|ri|s|t|y.'

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

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

2 и 3 несовместимы, а 1 и 3 несовместимы, но 1 и 2 совместимы. Таким образом, уникальный MIS имеет размер $ s = 2 $ и содержит вершины 1 и 2. Соответствующее анаграммирование веса 7-2-1 = 4-это der|a|t|e|rt|r|e|a|der.

Это не охватывает точный алгоритм, который вы имели в виду (который Tsuyoshi Ito's Ответ делает), но пытаюсь понять основную проблему найти «интересную» анаграммы ...

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

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

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

Проблема может быть сформулирована с точки зрения Группы перестановки.

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

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

  • $ () $ означает отсутствие перестановки.
  • $ (1) $ означает 1 замену 1, что также не является перестановкой.
  • $ (12) $ означает, что 1 и 2 поменяются.
  • $ (123) $ означает 1 заменяет 2, что заменяет 3, что заменяет 1 (вращение).
  • И так

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

Кажется, что вам интересны ходы (для слова длины $ n $):

  • Смена пар одиночных символов: это свопы, такие как $ (12) $
  • Образцы паров из 2 последовательных символов: это перестановка формы $ (a b) (a+1 b+1) $, где $ a> 0 $ и $ b
  • ...
  • Образцы паров n последовательных символов: это перестановки формы $ (a b) (a+1 b+1) cdots (a+i-1 b+i-1) $, где $ a> 0 $, $ a+i-1 le b $ и $ b+i-1 le n $.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top