Ich habe eine Anwendung, die Milliarden von Levenshtein Abstand zwischen Saitenpaaren berechnen muss. Die Strings sind kurze (70 in der Länge) DNA-Sequenzen, die nur aus 4 Zeichen bestehen. Es kann auch angenommen werden, dass eine der Zeichenfolgen fest ist, dh wir vergleichen eine feste Zeichenfolge mit einer Milliarde anderer Zeichenfolgen.
Ich weiß, dass die dynamische Programmierimplementierung der Levenshtein-Distanz , würde gerne wissen, ob es Raum für Verbesserungen gibt. Ich habe diese beiden Algorithmen gefunden:
- -Algorithmus, bei dem die Bearbeitungsentfernung von Berghel et al . Ich kann jedoch nicht davon ausgehen, dass klein ist, so dass es möglicherweise keinen Vorteil bringt
- Näherung in Zeit von Andoni et al . Aber ich habe zwei Bedenken:
- Ist dieser Algorithmus auch in der Praxis schnell?
- Bedeutet dass die berechnete Bearbeitungsentfernung im schlimmsten Fall mal der tatsächlichen ist ? In diesem Fall ist es zu viel.
Kennen Sie andere Algorithmen / Ideen / Ansätze, die möglicherweise anwendbar sind?
strings
edit-distance
Ameer Jewdaki
quelle
quelle
Antworten:
Ein Ansatz besteht darin, einen Levenshtein-Automaten für die feste Zeichenfolge zu erstellen (siehe z . B. hier ). Gegeben eine Zeichenfolgex und eine Entfernung D können Sie einen DFA erstellen, der alle Zeichenfolgen erkennt, die sich in einiger Entfernung befinden ≤D von x . Auf diese Weise können Sie testen, ob sich eine Zeichenfolge in der Nähe befindetx im O(n) Zeit, wo n ist die Länge der Zeichenfolge. Ich bin mir nicht sicher, wie viel Platz erforderlich ist, um den DFA zu speichern (sie sind linear inm,n , könnte aber exponentiell sein in D ).
Alternativ können Sie einen "Early-Out" -Algorithmus zum Berechnen der Bearbeitungsentfernung verwenden. Sie haben erwähnt, dass Sie nur dann an der Bearbeitungsentfernung interessiert sind, wenn diese unter einem bestimmten Schwellenwert liegtD . Es gibt einen "Early-Out" -Algorithmus zum Berechnen der Bearbeitungsentfernung, deren Laufzeit beträgtO(max(n,m)×D) , der den Bearbeitungsabstand berechnet, wenn er oder "zu groß" ausgibt, wenn er . Grundsätzlich verwenden Sie den standardmäßigen dynamischen Programmieralgorithmus für die Bearbeitungsentfernung, berechnen jedoch nur die Elemente der Matrix, die von der Diagonale entfernt sind. In Ihrem Fall könnte dies besser sein oder auch nicht als die anderen Alternativen.≤D >D ≤D
quelle
Wenn ich Milliarden machen müsste und es nur 4 Zeichen wären, würde ich die Zeichen als
1000
0100
0010
0001 darstellen.
Es ist dann eine 35-Byte-Ganzzahl
Punkt ein bisschen weise
and
und zähle die EinsenNicht perfekt, aber Milliarden sind viel, es sei denn, Sie werfen viel CPU darauf.
quelle