Пошук цікавих анаграм


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
Ні, звичайно ні. Ви перетворюєте кожне слово в канонічну форму, яка має однакові букви в алфавітному порядку. (Наприклад, канонічна форма cholecystoduodenostomyє ccddeehlmnooooossttuyy.) Два слова є анаграмами тоді і лише тоді, коли вони мають однакову канонічну форму. Ви зберігаєте слова в хеш-таблиці, введені їх канонічними формами, і коли ви виявите зіткнення, у вас є анаграма.
Марк Домінус

Зараз у мене в блозі є велика кількість більш-менш пов'язаної інформації про це: (α) (β) (γ) (δ)
Марк Домінус

Відповіді:


21

Ця проблема відома як "мінімальна загальна проблема розділів рядків." кожна літера зустрічається щонайбільше двічі у кожному з вхідних рядків, як це доводить Гольдштейн, Кілман та Чжен [GKZ05]. Це означає, що алгоритм поліноміального часу не існує, якщо P = NP. (Звичайно, якщо кожна буква трапляється не більше одного разу, то проблема є тривіальною, оскільки існує лише одна анаграма.)

З позитивного боку, ті ж самі автори [GKZ05] дають алгоритм апроксимації багаточленного часу 1.1037 під тим же обмеженням. ("Алгоритм наближення 1.1037 " означає алгоритм, який може не вивести правильну відповідь А, але гарантовано виводить значення B таке, що AB ≤ 1.1037 А. ) Вони також дають алгоритм 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

Він не стосується точного алгоритму, який ви мали на увазі (що відповідає відповідь Цуйосі Іто ), але намагається розібратися в основній проблемі пошуку "цікавих" анаграм ...

Моя перша думка полягала в тому, щоб скористатися деякими варіантами на відстані редагування, де атомні зміни зважуються відповідно до їх "цікавості", а не до звичайних "складностей" чи "сплутаності". Звичайно, малоймовірно, що ви зможете ефективно кодувати дійсно цікаві трансформації таким чином, оскільки вони, ймовірно, будуть не локальними і, отже, стикаються з проблемами, що заповнюють НП, ініційованими МІС тощо.

Отже, другою думкою було б побудувати вирівнювання літер до букви між словами (à la align of machine translation), а потім оцінити самі вирівнювання за "цікавістю" (наприклад, підрахунок вирівнювання, що приймає суміжні літери до не- суміжні літери, або скільки вирівнювань перетинає кожне вирівнювання тощо; а потім поєднуйте їх усі за допомогою логістичної моделі чи подібної).

Третя ідея - повністю відмовитися від погляду на структуру самої анаграмізації, а замість цього поглянути на семантику слів. Часто те, що робить анаграму «цікавою», - це невідповідність значень слів, які беруть участь. Тому спробуйте щось на зразок обчислення їх відстані в 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.