Hier ist der Algorithmus (in Rubin) istOptimierung der Damerau Version des levenshtein Algorithmus besser als O (n * m)
#http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance
def self.dameraulevenshtein(seq1, seq2)
oneago = nil
thisrow = (1..seq2.size).to_a + [0]
seq1.size.times do |x|
twoago, oneago, thisrow = oneago, thisrow, [0] * seq2.size + [x + 1]
seq2.size.times do |y|
delcost = oneago[y] + 1
addcost = thisrow[y - 1] + 1
subcost = oneago[y - 1] + ((seq1[x] != seq2[y]) ? 1 : 0)
thisrow[y] = [delcost, addcost, subcost].min
if (x > 0 and y > 0 and seq1[x] == seq2[y-1] and seq1[x-1] == seq2[y] and seq1[x] != seq2[y])
thisrow[y] = [thisrow[y], twoago[y-2] + 1].min
end
end
end
return thisrow[seq2.size - 1]
end
Mein Problem ist, dass mit einer seq1 der Länge 780 und seq2 der Länge 7238 dauert dies etwa 25 Sekunden, um auf einem i7-Laptop zu laufen. Im Idealfall möchte ich das auf eine Sekunde reduzieren, da es als Teil einer Webapp läuft.
Ich fand, dass there is a way to optimize the vanilla levenshtein distance so, dass die Laufzeit von O (n * m) nach O (n + d^2) fällt, wobei n die Länge der längeren Zeichenfolge und d die Bearbeitungsdistanz ist. So, meine Frage wird, kann die gleiche Optimierung auf die Dameau-Version angewendet werden, die ich habe (oben)?
Haben Sie [Levenshtein Automata] (http://blog.notdot.net/2010/07/Damn-Cool-Algorithms-Levenshtein-Automata) angeschaut? – dbenhur
Müssen Sie die genaue Entfernung wissen, oder nur, wenn die Entfernung unter einer Schwelle ist? Ersteres ist viel schwieriger als letzteres. –