Interessante Anagramme finden


31

, und sind zwei Zeichenfolgen gleicher Länge. Eine Darstellung von zwei Zeichenfolgen ist eine bijektive Abbildung von so dass für jedes .b 1 b 2b na1a2anb1b2bna i = b p ( i ) ip:[1n][1n]ai=bp(i)i

Es kann mehr als ein Diagramm für dasselbe Zeichenfolgenpaar geben. Zum Beispiel, wenn `abcab` und wir haben und unter anderem.b = p 1 [ 1 , 2 , 3 , 4 , 5 ] [ 4 , 5 , 1 , 2 , 3 ] p 2 [ 1 , 2 , 3 , 4 , 5 ] [ 2 , 5 , 1 , 4 , 3 ]a=b=cababp1[1,2,3,4,5][4,5,1,2,3]p2[1,2,3,4,5][2,5,1,4,3]

Wir werden sagen, dass das Gewicht eines Anagramms die Anzahl der Schnitte ist, die in der ersten Zeichenfolge ausgeführt werden müssen, um Blöcke zu erhalten, die neu angeordnet werden können, um die zweite Zeichenfolge zu erhalten. Formal ist dies die Anzahl der Werte von für die . Das heißt, er die Anzahl der Punkte ist , bei der ist nicht durch genau 1.Bei Beispiel erhöhen, und , da schneidet einmal in die Brocken und und p_2 Schnitte vier mal in fünf Stücke.w(p)pi[1n1]p(i)+1p(i+1)pw(p1)=1w(p2)=4p11234512345p212345

Angenommen, es gibt ein Anagramm für zwei Zeichenfolgen a und b . Dann muss mindestens ein Anagramm das geringste Gewicht haben. Nehmen wir an, dies ist das leichteste . (Möglicherweise gibt es mehrere leichteste Anagramme. Das ist mir egal, da ich nur an den Gewichten interessiert bin.)

Frage

Ich möchte einen Algorithmus, der bei zwei Strings, für die ein Anagramm existiert, effizient das genaue Gewicht des leichtesten Anagramms der beiden Strings ergibt . Es ist in Ordnung, wenn der Algorithmus auch ein leichtestes Diagramm liefert, muss es aber nicht.

Es ist ziemlich einfach, alle Anagramme zu generieren und zu wägen, aber es kann viele geben, daher würde ich eine Methode bevorzugen, die leichte Anagramme direkt findet.


Motivation

Der Grund, warum dieses Problem von Interesse ist, ist folgender. Es ist sehr einfach, den Computer das Wörterbuch durchsuchen zu lassen und Anagramme zu finden, Wortpaare, die genau dieselben Buchstaben enthalten. Viele der erstellten Anagramme sind jedoch uninteressant. Die längsten Beispiele im zweiten internationalen Wörterbuch von Webster sind:

Cholezystoduodenostomie
Duodenocholezystostomie

Das Problem sollte klar sein: diese uninteressant sind , weil sie einen sehr leichten Anagrammieren dass einfach tauscht die zugeben cholecysto, duedenound stomyAbschnitte, bei einem Gewicht von 2. Andererseits ist diese viel kürzer Beispiel ist viel mehr überraschend und interessant:

Küste
Schnitts

Hier hat das leichteste Diagramm das Gewicht 8.

Ich habe ein Programm, das diese Methode verwendet, um interessante Anagramme zu lokalisieren, und zwar solche, für die alle Anagramme ein hohes Gewicht haben. Dies geschieht jedoch durch Generieren und Abwägen aller möglichen Anagramme, was langsam ist.


Wie findet man aus Neugier Paare von Anagrammen? Führen Sie eine Brute-Force -Suche in allen Wörtern derselben Länge durch? O(n2)
Pedro

4
Nein natürlich nicht. Sie konvertieren jedes Wort in eine kanonische Form, die die gleichen Buchstaben in alphabetischer Reihenfolge enthält. (Zum Beispiel von der kanonischen Form cholecystoduodenostomyist ccddeehlmnooooossttuyy.) Zwei Worte Anagramme sind , wenn und nur wenn sie die gleiche kanonische Form haben. Sie speichern die Wörter in einer Hash-Tabelle, die durch ihre kanonischen Formen gekennzeichnet ist. Wenn Sie eine Kollision finden, erhalten Sie ein Anagramm.
Mark Dominus

Ich habe jetzt eine große Menge mehr oder weniger verwandter Informationen in meinem Blog: (α) (β) (γ) (δ)
Mark Dominus

Antworten:


21

Dieses Problem wird als "minimales gemeinsames String-Partitionsproblem" bezeichnet. (Genauer gesagt entspricht die Antwort in dem minimalen gemeinsamen String-Partitionsproblem der Antwort in Ihrem Problem plus 1.) Leider ist es NP-schwer, selbst mit der Einschränkung, dass Jeder Buchstabe kommt höchstens zweimal in jeder der Eingabezeichenfolgen vor, wie Goldstein, Kilman und Zheng [GKZ05] beweisen. Dies bedeutet, dass kein Polynomzeitalgorithmus existiert, es sei denn, P = NP. (Wenn natürlich jeder Buchstabe höchstens einmal vorkommt, ist das Problem trivial, da es nur ein Anagramm gibt.)

Positiv zu vermerken ist, dass dieselben Autoren [GKZ05] unter derselben Einschränkung einen Algorithmus zur Näherung der Polynomzeit 1.1037 angeben. (Ein "1.1037- Näherungsalgorithmus " bedeutet einen Algorithmus, der möglicherweise nicht die richtige Antwort A ausgibt, aber garantiert einen Wert B ausgibt, so dass AB ≤ 1.1037 A. ) Sie geben auch einen linearen 4-Näherungsalgorithmus unter schwächere Einschränkung, dass jeder Buchstabe höchstens dreimal in jeder der Eingabezeichenfolgen vorkommt.

[GKZ05] Avraham Goldstein, Petr Kolman und Jie Zheng. Minimales allgemeines String-Partitionsproblem: Härte und Approximationen. Electronic Journal of Combinatorics , 12, Artikel R50, 2005. http://www.combinatorics.org/ojs/index.php/eljc/article/view/v12i1r50



9

Dies ist eine Fortsetzung der obigen Antwort von Tsuyoshi Ito , die den wichtigsten Teil des von ihm zitierten GKZ05-Papiers zusammenfasst .

Das Papier zeigt eine Reduktion auf das Problem des Maximal Independent Set ( MIS ). Konstruieren Sie einen Graphen dessen Eckpunkte Paare ( i , j ) sind, so dass a i = b j und a i + 1 = b j + 1 . Verbinden Sie die Eckpunkte ( i , j ) und ( k , ) (wobei i k ist ) mit einer Kante, wenn es unmöglich ist, dass ein Anagramm alle i abbildetG(i,j)ai=bjai+1=bj+1(i,j)(k,)ik und i + 1 j + 1 und k l und k + 1 l + 1 . Dies ist leicht zu erkennen; Eine solche Zuordnung ist nicht möglich, wenn eine der folgenden Bedingungen erfüllt ist:iji+1j+1kk+1+1

  1. und j & ne; li=kj
  2. und j + 1 & ne; li+1=kj+1
  3. und { j , j + 1 } sind nicht verbunden mit { , + 1 }i+1<k{j,j+1}{,+1}

Angenommen, der resultierende Graph hat eine maximale unabhängige Menge von Größen s . Dann ist das minimale Anagrammgewicht genau n - s - 1 , wobei n die Länge der Saiten a und b ist . (Die Umkehrung gilt auch: Ein Anagramm mit geringem Gewicht wird direkt in ein großes MIS für G übersetzt . Einzelheiten finden Sie auf den Seiten 4–5 des Papiers.)Gsns1nabG

Betrachten Sie zum Beispiel die beiden Zeichenfolgen yttriousund touristy. Der entsprechende Graph hat zwei Eckpunkte, einen für das gemeinsame ouPaar und einen für das gemeinsame riPaar. Es gibt keine Kante zwischen den Scheitelpunkten, da es möglich ist, ein Diagramm zu erstellen, das sowohl ouauf ouals auch riauf riabgebildet wird. oder man kann überprüfen, ob die drei Bedingungen vor allem scheitern. Der Graph hat also offensichtlich ein MIS der Größe und das minimale Anagrammgewicht ist in der Tat 8-2-1 = 5, entsprechend dem Anagramm ↔ . 's=2y|t|t|ri|ou|st|ou|ri|s|t|y

Auf der anderen Seite betrachten deraterund treader. Dieses Mal hat das Diagramm drei Eckpunkte:

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

2 und 3 sind nicht kompatibel, und 1 und 3 sind nicht kompatibel, aber 1 und 2 sind kompatibel. Das eindeutige MIS hat also die Größe und enthält die Eckpunkte 1 und 2. Die entsprechende Darstellung des Gewichts 7-2-1 = 4 ist ↔ .s=2der|a|t|e|rt|r|e|a|der


2
Vielen Dank für den Follow-up-Beitrag, aber dies ist kein Beweis für die NP-Vollständigkeit Ihres Problems. Um die NP-Vollständigkeit Ihres Problems zu beweisen, müssen Sie einige bekannte NP-Vollständigkeitsprobleme auf Ihr Problem reduzieren, und das ist Satz 2.2 von [GKZ05]. Was Sie hier vorgestellt haben (Lemma 1.1 von [GKZ05]), ist eine Reduktion in die entgegengesetzte Richtung.
Tsuyoshi Ito

Dies ist eine schöne Neuformulierung. Eine triviale Änderung, die konzeptionell eine kleine Vereinfachung darstellt (zumindest für mich): Anstatt Kanten zwischen Paaren zu zeichnen, die nicht kompatibel sind, und nach der maximalen unabhängigen Menge zu fragen, können wir Kanten zwischen Paaren zeichnen, die kompatibel sind, und nach der maximalen Clique fragen. (Ich finde es einfacher, darüber nachzudenken, "wie viele Paare wir maximal zusammenhalten können".)
ShreevatsaR

2

Es geht nicht um den genauen Algorithmus, den Sie sich vorgestellt haben (die Antwort von Tsuyoshi Ito ), sondern darum, das zugrunde liegende Problem zu lösen, "interessante" Anagramme zu finden ...

Mein erster Gedanke war, eine Variation der Bearbeitungsentfernung zu verwenden, bei der die atomaren Änderungen eher nach ihrer "Interessantheit" als nach den üblichen "Schwierigkeits" - oder "Verwirrbarkeit" -Gewichten gewichtet werden. Natürlich ist es unwahrscheinlich, dass Sie die wirklich interessanten Transformationen auf diese Weise effizient codieren können, da sie wahrscheinlich nicht lokal sind und daher in die NP-vollständigen Probleme von MIS usw. geraten.

Der zweite Gedanke wäre also, eine Buchstaben-zu-Buchstaben-Ausrichtung zwischen den Wörtern zu konstruieren (à la maschinelle Übersetzungsausrichtungen) und dann die Ausrichtungen selbst auf "Interessantheit" zu bewerten (z. B. die Ausrichtungen zu zählen, die benachbarte Buchstaben zu Nicht-Buchstaben machen). benachbarte Buchstaben oder wie viele Ausrichtungen jede Ausrichtung kreuzt usw. und kombinieren Sie sie dann alle über ein loglineares Modell oder so).

Die dritte Idee besteht darin, den Blick auf die Struktur des Anagramms selbst vollständig aufzugeben und stattdessen die Semantik der Wörter zu betrachten. Was ein Anagramm oft "interessant" macht, ist die Inkongruenz zwischen den Bedeutungen der beteiligten Wörter. Versuchen Sie also etwas wie die Berechnung der Entfernung in WordNet oder ähnliches.


0

Das Problem kann in Form von Permutationsgruppen formuliert werden .

Nun enthält eine Permutationsgruppe alle "Anagrammzüge", sowohl primitiv (Vertauschen von zwei Buchstaben) als auch zusammengesetzt aus Sequenzen primitiver Züge. Es scheint, dass Sie nur an einer Teilmenge der möglichen Permutationen interessiert sind. Ich werde versuchen, diese zu definieren.

Erinnern Sie sich zunächst an die Notation für Permutationen, nämlich die sogenannte Zyklusnotation :

  • ()
  • (1)
  • (12)
  • (123)
  • und so weiter

Diese einfachen 'Zyklen' beschreiben komplexere Permutationen.

n

  • (12)
  • (ein b)(ein+1 b+1)ein>0b<ein+1b+1n
  • ...
  • (ein b)(ein+1 b+1)(ein+ich-1 b+ich-1)ein>0a+i1bb+i1n

Diese Bewegungen bilden die Grundlage für Ihren Algorithmus. Was Sie interessiert, ist, die kleinste Sequenz dieser Bewegungen zu finden, um von einem Wort zum nächsten zu gelangen.

Ich kenne keinen Algorithmus, um dies zu berechnen, abgesehen von der Brute-Force-Suche, aber zumindest gibt es jetzt eine klarere (ich hoffe) Beschreibung der primitiven Bewegungen. (Und vielleicht kann ein Gruppentheoretiker unter uns auf einen geeigneten Algorithmus verweisen.)


1
Vielen Dank. Vielleicht bin ich pessimistisch, aber es scheint mir, dass dieser Ansatz schwierig sein wird. Ich glaube nicht, dass ein gruppentheoretischer Ansatz Früchte trägt, wenn wir nicht zuerst herausfinden, welche Permutationsgruppe von Interesse ist, und das hängt von den eingegebenen Zeichenfolgen ab. Ich denke, eine effiziente Repräsentation endlicher Gruppen ist ein extrem tiefes und reiches Problem. Aber ich möchte mich irren.
Mark Dominus

1
„Was Sie interessiert, ist, die kleinste Sequenz dieser Schritte zu finden, um von einem Wort zum nächsten zu gelangen.“ Ich denke nicht, dass dies richtig ist. Wenn beispielsweise n = 4 ist, hat der Swap (1 2) das Gewicht 2, aber der Swap (2 3) das Gewicht 3. Ihre Zählweise unterscheidet diese beiden nicht.
Tsuyoshi Ito

Ich antwortete spät in der Nacht. Ich habe das Gewichtsmaß nicht richtig verstanden. Tatsächlich verstehe ich es jetzt nicht. Ich dachte, Sie wollten das Verschieben von Buchstabenblöcken zulassen, weshalb ich mir die Mühe gemacht habe, diese Primitive zu definieren. Meine Antwort könnte Inspiration liefern, also lasse ich es, obwohl es falsch ist.
Dave Clarke

0

Bei der Cholezystoduodenostomie / Duodenocholezystostomie stelle ich fest, dass Sie, wenn Sie jedem Zeichen eine Nummer zuweisen, die beschreibt, um wie viel es sich als Delta bewegt hat, etwas wie 7 7, dann 8 -7, dann 6 0 haben. Das ist nicht richtig, da einige Zeichen möglicherweise wiederholt wurden (das zweite c wurde nur um 2 vorwärts und nicht um 7 rückwärts verschoben), aber immer noch sehr "lauflängencodierbar", da Sie dieselben Deltas in einer Reihe sehen.

Vergleiche mit Küste / Abschnitt, wo du so etwas wie (+2) (+ 5) (+ 5) (- 3) (- 1) (+ 3) siehst .... viel weniger "Lauflänge codierbar".

Vielleicht könnte Ihnen die Zufälligkeit der Deltas eine "Punktzahl" darüber geben, wie interessant das Anagramm ist?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.