Bearbeiten Sie den Abstand der Liste mit eindeutigen Elementen

12

Levenshtein-Entfernung Abstand zwischen Listen bearbeiten ist ein gut untersuchtes Problem. Aber ich kann nicht viel über mögliche Verbesserungen finden, wenn bekannt ist, dass kein Element mehr als einmal in jeder Liste vorkommt .

Nehmen wir auch an, dass die Elemente vergleichbar / sortierbar sind (die zu vergleichenden Listen sind jedoch zunächst nicht sortiert).

O(min(m,n)s)O(min(s,m,n)s)s

Formeller,

Wie effizient können wir die Bearbeitungsentfernung zwischen zwei angegebenen Zeichenfolgen s, t \ in \ Sigma ^ * berechnen, s,tΣ mit dem Versprechen, dass sie keine wiederholten Buchstaben haben?

Σ ist ein sehr großes Alphabet.

user362178
quelle
Was ist deine Frage jetzt; Wie beschleunige ich die paarweise Bearbeitung einer Entfernung oder wie berechne ich alle paarweisen Entfernungen einer Liste von Zeichenfolgen?
Raphael
2
Ich vermute, die Frage lautet: Wie berechnet man die Bearbeitungsentfernung zwischen , wobei Zeichenfolgen über einem sehr großen Alphabet , und wir sind sicher, dass in oder kein Buchstabe zweimal vorkommt in (das OP repräsentiert jede Zeichenkette als Liste von Buchstaben, dh als Liste von Elementen). Dies muss jedoch bestätigt werden. s,ts,tΣΣst
DW
Ja, in diesem Fall besteht das große Alphabet aus Datenbankindizes und die "Zeichenfolgen" s und t sind Listen, die diese Indizes enthalten.
user362178
Für diejenigen, die sich über die Komplexität wundern: und sind die Längen der Eingabezeichenfolgen und ist die tatsächliche Bearbeitungsentfernung, daher ist sie in der Komplexität enthalten. Die Kosten für jeden bearbeiten gilt als 1 , aber ist wahrscheinlich irrelevant für die Berechnung dieser Distanz (die Anzahl der Bearbeitungen ). n s smnss
Albert Hendriks

Antworten:

3

TL; DR: Eine etwas restriktivere Art der Bearbeitungsentfernung, in der nur einzelne Zeichen eingefügt und gelöscht werden können, kann in linearithmischer Zeit berechnet werden, wenn beide (oder auch nur eine) Zeichenketten eindeutige Zeichen haben. Dies gibt nützliche Ober- und Untergrenzen für die Levenshtein-Bearbeitungsentfernung.

Bearbeitungsentfernung und längste häufig vorkommende Teilsequenzen einfügen / löschen

Der Levenshtein-Bearbeitungsabstand ermöglicht das Einfügen, Löschen und Ersetzen einzelner Zeichen, wobei jedem Zeichen ein Wert von 1 zugewiesen wird. Wenn wir uns auf das Einfügen und Löschen beschränken, erhalten wir ein ähnliches Abstandsmaß, bei dem die Kosten für Ersetzungen 2 betragen (da jede Ersetzung 2 betragen kann) durch Einfügen und Löschen nachgeahmt werden). Ich kenne keinen Standardnamen für diese restriktivere Art der Bearbeitungsentfernung, daher nenne ich sie "Bearbeitungsentfernung einfügen / löschen". Es entspricht genau dem LCS-Problem (Longest Common Subsequence) , bei dem wir zwei Zeichenfolgen mit der Länge bzw. n erhalten und die Länge der längsten Teilfolge kennen möchten, die in beiden auftritt. Wenn zwei Saiten LCS L habenmnL, dann haben sie den Einfüge- / Löschbearbeitungsabstand n+m2L : Der einfachste Weg, dies zu sehen, besteht darin, die Zeichenfolgen so auszurichten, dass Zeichen in der LCS übereinander gestapelt erscheinen, während Zeichen, die nicht in der LCS enthalten sind, gegenüber a angezeigt werden -Lückencharakter. Es wird dann offensichtlich sein, dass wir den ersten String in den zweiten bearbeiten können, indem wir eine Einfügung machen, wo immer sich ein -in der oberen Reihe befindet, und eine Löschung, wo immer sich ein -in der unteren Reihe befindet. Beispielsweise:

-C-IRC-LE
T-RI-CKLE

Hier hat der LCS von CIRCLEund TRICKLE, ICLEdie Länge 4 und der Editierabstand beträgt tatsächlich .6+724=5

Am längsten zunehmende Teilfolgen

Der Grund für diesen Umweg ist, dass es eine sehr effiziente Möglichkeit gibt, die LCS (und damit die Einfüge- / Lösch-Bearbeitungsentfernung) zu berechnen, wenn mindestens eine der Sequenzen nur unterschiedliche Zeichen enthält: In diesem Fall kann das LCS-Problem in transformiert werden das Problem, eine am längsten ansteigende Folge zu finden , die in der Zeit gelöst werden kann . Angenommen, wir haben zwei Zeichenfolgen A und B und Zeichenfolge A hat unterschiedliche Zeichen. Wir können das erste Zeichen in A in 1, das zweite in 2 usw. umbenennen und dabei verfolgen, welche Nummer wir jedem Zeichen in einer Tabelle zugewiesen haben. Dann in BO(nlogn)ABAAB, benennen wir die Zeichen in dieser Tabelle um (dh jedes Vorkommen des ersten Zeichens in Awird in 1 geändert usw.). Schließlich suchen wir nach einer am längsten zunehmenden Folge in B. Dies entspricht einem LCS zwischen Aund B, und von dort aus können wir sofort die Einfüge- / Lösch-Bearbeitungsentfernung berechnen. Die benötigte Gesamtzeit beträgt nur wenn A und B die Länge n bzw. m haben.O(n+mlogm)ABnm

Grenzen auf Levenshtein bearbeiten Abstand

Die Einfüge- / Löschentfernung liefert eindeutig eine Obergrenze für die Levenshtein-Entfernung (da jede gültige Sequenz von Editiervorgängen unter der Einfüge- / Löschentfernung auch eine gültige Sequenz von Levenshtein-Editiervorgängen ist). Das Teilen des Einfüge- / Löschbearbeitungsabstands durch 2 ergibt auch eine Untergrenze, da im schlimmsten Fall jede Levenshtein-Bearbeitungsoperation in 2 Einfüge- / Löschbearbeitungsoperationen geändert werden kann.

Verallgemeinerungen

rO((r+n)logn)rndiffdiffO(nd)d

Hunt, J .; Szymanski, T. (1977), "Ein schneller Algorithmus zur Berechnung der längsten gemeinsamen Teilsequenzen ", Communications of the ACM, 20 (5): 350–353, doi: 10.1145 / 359581.359603

j_random_hacker
quelle