Levenshtein距离的Haskell程序

时间:2013-11-27 11:46:34

标签: haskell levenshtein-distance

我需要Haskell中的一个程序来计算Levenshtein distance

1 个答案:

答案 0 :(得分:5)

您需要计算Levenshtein距离(也称为编辑距离),该距离定义为字符串ab :(取自Wikipedia):

enter image description here

因为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进行比较。