Я пытаюсь реализовать levenshtein distance (или редактировать расстояние) в Haskell, но его производительность быстро уменьшается при увеличении длины строки.
Я все еще довольно новичок в Haskell, так что было бы неплохо, если бы вы могли дать мне несколько советов о том, как я мог бы улучшить алгоритм. Я уже пытался "прекомпилировать" значения (inits), но поскольку он ничего не менял, я вернул это изменение.
Я знаю, что в Hackage уже реализована editDistance, но мне нужно, чтобы она работала над списками произвольных токенов, а не строк. Кроме того, я считаю это немного сложным, по крайней мере, по сравнению с моей версией.
Итак, вот код:
-- standard levenshtein distance between two lists editDistance :: Eq a => [a] -> [a] -> Int editDistance s1 s2 = editDistance' 1 1 1 s1 s2 -- weighted levenshtein distance -- ins, sub and del are the costs for the various operations editDistance' :: Eq a => Int -> Int -> Int -> [a] -> [a] -> Int editDistance' _ _ ins s1 [] = ins * length s1 editDistance' _ _ ins [] s2 = ins * length s2 editDistance' del sub ins s1 s2 | last s1 == last s2 = editDistance' del sub ins (init s1) (init s2) | otherwise = minimum [ editDistance' del sub ins s1 (init s2) + del -- deletion , editDistance' del sub ins (init s1) (init s2) + sub -- substitution , editDistance' del sub ins (init s1) s2 + ins -- insertion ]
Кажется, это правильная реализация, по крайней мере, она дает те же результаты, что и этот онлайн-инструмент.
Заранее благодарим за помощь! Если вам нужна дополнительная информация, сообщите мне.
Привет, BZN