测量两个字符串之间相似性的有效方法是什么? (编辑距离使堆栈太深)

问题描述 投票:0回答:1

所以,我从这个开始:http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#Ruby

这对于非常小的字符串非常有效。但是,我的字符串长度可能超过 10,000 个字符 - 并且由于编辑距离是递归的,这会导致我的 Ruby on Rails 应用程序中出现堆栈太深错误。

那么,是否有另一种可能较少堆栈密集的方法来查找两个大字符串之间的相似性?

或者,我需要一种方法来使堆栈具有更大的大小。 (不过,我认为这不是解决问题的正确方法)

ruby-on-rails string compare similarity levenshtein-distance
1个回答
7
投票

考虑非递归版本以避免过多的调用堆栈开销。 Seth Schroeder 在 Ruby 中有一个迭代实现,它使用多维数组来代替;它似乎与编辑距离的动态规划方法有关(如维基百科文章的伪代码中所述)。 Seth的ruby代码转载如下:

def levenshtein(s1, s2)
  d = {}
  (0..s1.size).each do |row|
    d[[row, 0]] = row
  end
  (0..s2.size).each do |col|
    d[[0, col]] = col
    end
  (1..s1.size).each do |i|
    (1..s2.size).each do |j|
      cost = 0
      if (s1[i-1] != s2[j-1])
        cost = 1
      end
      d[[i, j]] = [d[[i - 1, j]] + 1,
                   d[[i, j - 1]] + 1,
                   d[[i - 1, j - 1]] + cost
                  ].min
    end
  end
  return d[[s1.size, s2.size]]
end
© www.soinside.com 2019 - 2024. All rights reserved.