Here is the algorithm (in ruby)
#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
My problem is that with seq1 of length 780 and seq2 of length 7238 it takes about 25 seconds to work on i7 laptop. Ideally, I would like it to be reduced to about a second, as it works as part of a web application.
I found that there is a way to optimize the distance from the vanilla levenshtein , so the runtime drops from O (n * m) to O (n + d ^ 2), where n is the length of the longer line, d is the editing distance. So my question is, can the same optimization apply to the damerau version that I have (above)?
source share