我需要Haskell中的一个程序来计算Levenshtein distance。
答案 0 :(得分:5)
您需要计算Levenshtein距离(也称为编辑距离),该距离定义为字符串a
和b
:(取自Wikipedia):
因为lev(i,j)的值仅取决于先前的值,我们可以利用Haskell的惰性来初始化一个数组,其中位置(i,j)处的元素值是先前值的函数。相同的阵列!请参阅Dynamic programming example以查看如何执行此操作的示例。
以下是lev
的基本实现:
import Data.Array
lev :: String -> String -> Int
lev x y = c ! (m, n)
where
c = listArray ((0, 0), (m, n)) [compute i j | i <- [0 .. m], j <- [0 .. n]]
compute 0 j = j
compute i 0 = i
compute i j
| x !! (i - 1) == y !! (j - 1) = c ! (i - 1, j - 1)
| otherwise = 1 + (minimum $ map (c !) [(i , j - 1),
(i - 1, j),
(i - 1, j - 1)])
m = length x
n = length y
此代码可以进一步优化,但应该为您提供入门的好主意。
在计算Levenshtein之后,您只需将其与编辑成本约束k进行比较。