我想在较大的字符串中找到一个Levenshtein距离的字符串。我已经编写了用于查找两个字符串之间距离的代码,但是当我想找到一些具有固定Levenshtein距离的子字符串时,我希望有效地实现。
module Levenshtein
def self.distance(a, b)
a, b = a.downcase, b.downcase
costs = Array(0..b.length) # i == 0
(1..a.length).each do |i|
costs[0], nw = i, i - 1 # j == 0; nw is lev(i-1, j)
(1..b.length).each do |j|
costs[j], nw = [costs[j] + 1, costs[j-1] + 1, a[i-1] == b[j-1] ? nw : nw + 1].min, costs[j]
end
end
costs[b.length]
end
def self.test
%w{kitten sitting saturday sunday rosettacode raisethysword}.each_slice(2) do |a, b|
puts "distance(#{a}, #{b}) = #{distance(a, b)}"
end
end
end
答案 0 :(得分:0)
检查TRE library,这完全符合这一点(在C中),效率非常高。现在仔细看看匹配函数,它基本上是500行不可读(但必要的)代码。
我要说的是,不要滚动自己的版本,并且不打算阅读有关该主题的所有多篇难题论文(搜索"近似的字符串匹配")并且没有几个月可以用于研究这个主题,你可以更好地在图书馆周围写一个小包装器。无论如何,与C中可以获得的相比,你的Ruby版本效率低下。