J'ai cette fonction Ruby qui me dit si deux chaînes sont "presque" égales, c'est-à-dire si tous les caractères de la chaîne sont identiques et ordonnés de la même manière sauf un. Ainsi, par exemple, ceux-ci sont égauxExiste-t-il un meilleur moyen de comparer les chaînes dans un délai raisonnable?
equal
eual
mais ceux-ci ne sont pas
eal
equal
(deux caractères sont manquants dans ce qui précède). Donc, avec l'aide, je suis venu avec cette
(lcs(a,b) == shortest && longest.length - shortest.length == 1)
dans lequel las est définie par
def lcs(xstr, ystr)
return "" if xstr.empty? || ystr.empty?
x, xs, y, ys = xstr[0..0], xstr[1..-1], ystr[0..0], ystr[1..-1]
if x == y
x + lcs(xs, ys)
else
[lcs(xstr, ys), lcs(xs, ystr)].max_by {|x| x.size}
end
end
mais ma fonction prend un temps extraordinairement long. Notez mon indice de référence ci-dessous
2.4.0 :011 > timing = Benchmark.measure { StringHelper.lcs("navesxkolsky|1227000", "navsxkolsky|1227000") }
=> #<Benchmark::Tms:0x007fa1753830d8 @label="", @real=21.341279999993276, @cstime=0.0, @cutime=0.0, @stime=0.030000000000000027, @utime=21.28, @total=21.310000000000002>
Y at-il quelque chose que je manque ici qui peut obtenir mon temps de comparaison jusqu'à comme un seconde au lieu de 21?
Peut-être que la distance Levenshtein votre besoin: https://en.wikipedia.org/wiki/Levenshtein_distance Code Ruby ici: https: // stackoverflow. com/questions/46402903/levenshtein-distance-en-rubis/46410685 # 46410685 – Sofa