Advertisement
Guest User

Levenshtein distances in Haskell

a guest
Jul 6th, 2012
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. levenshtein::[Char] -> [Char] -> Int
  2. levenshtein "" "" = 0
  3. levenshtein "" s2 = length s2
  4. levenshtein s1 "" = length s1
  5. levenshtein s1 s2
  6.    | last s1 == last s2 = levenshtein (init s1) (init s2)
  7.    | otherwise = minimum [1 + levenshtein (init s1) s2,
  8.                           1 + levenshtein s1 (init s2),
  9.                           1 + levenshtein (init s1) (init s2)]
  10. levenshtein2::[Char] -> [Char] -> Int
  11. levenshtein2 "" "" = 0
  12. levenshtein2 "" s2 = length s2
  13. levenshtein2 s1 "" = length s1
  14. levenshtein2 s1 s2
  15.    | head s1 == head s2 = levenshtein (tail s1) (tail s2)
  16.    | otherwise = 1 + minimum [levenshtein (tail s1) s2,
  17.                               levenshtein s1 (tail s2),
  18.                               levenshtein (tail s1) (tail s2)]
  19.  
  20. levenshtein3 :: [Char] -> [Char] -> Int
  21. levenshtein3 s t =
  22.   d !! m !! n
  23.   where m = length s
  24.         n = length t
  25.         d = [[d2 i j | j <- [0..n]] | i <- [0..m]]
  26.         d2 0 0 = 0
  27.         d2 i 0 = i
  28.         d2 0 j = j
  29.         d2 i j
  30.           | s !! (i-1) == t !! (j-1)   = d !! (i-1) !! (j-1)
  31.           | otherwise                  = 1 + minimum [
  32.                                            d !! (i-1) !! j,
  33.                                            d !! (i-1) !! (j-1),
  34.                                            d !! i !! (j-1)
  35.                                           ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement