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).
Formeller,
Wie effizient können wir die Bearbeitungsentfernung zwischen zwei angegebenen Zeichenfolgen s, t \ in \ Sigma ^ * berechnen, mit dem Versprechen, dass sie keine wiederholten Buchstaben haben?
ist ein sehr großes Alphabet.
algorithms
strings
string-metrics
edit-distance
user362178
quelle
quelle
Antworten:
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 habenm n L , dann haben sie den Einfüge- / Löschbearbeitungsabstand n+m−2L : 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:Hier hat der LCS von6+7−2∗4=5
CIRCLE
undTRICKLE
,ICLE
die Länge 4 und der Editierabstand beträgt tatsächlich .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) A B A A B , benennen wir die Zeichen in dieser Tabelle um (dh jedes Vorkommen des ersten Zeichens in O(n+mlogm) A B n m
A
wird in 1 geändert usw.). Schließlich suchen wir nach einer am längsten zunehmenden Folge inB
. Dies entspricht einem LCS zwischenA
undB
, 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.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
diff
diff
quelle