Levensthein distance (거리 편집)에 일반적인 동적 프로그래밍 알고리즘을 구현하고 싶다고합시다. 이 지수 실행 시간을 앓고Data.Memocombinators를 사용하여 편집 거리 알고리즘 구현
editDistance [] ys = length ys
editDistance xs [] = length xs
editDistance (x:xs) (y:ys)
| x == y = editDistance xs ys
| otherwise = minimum [
1 + editDistance xs (y:ys),
1 + editDistance (x:xs) ys,
1 + editDistance xs ys]
, 그래서 기능을 memoize 할 필요가있다 : 재귀을 마련하는 것은 매우 쉽습니다. Data.Memocombinators를 사용하여 그렇게하고 싶습니다. 여러 가지 방법을 시도했습니다. 나는 그것이 적어도 다항식 것 때문에 어떤 메모이 제이션이 실행 시간에 눈에 띄는 개선을 기대하지만
import qualified Data.MemoCombinators as M
memLength str =
M.wrap
(\i -> drop i str)
(\xs -> length str - length xs)
(M.arrayRange (0,length str))
elm xs ys = (M.memo2 memListx memListy editDistance) xs ys
where
memListx = memLength xs
memListy = memLength ys
그러나, 메모이 제이션은, 어떤 효과가없는 것 같다 여기에 내 현재 시도이다. 내 구현에 어떤 문제가 있습니까? 편집 거리의 가능한 한 높은 수준의 정의를 유지하면서 실행 시간을 얻으려면 어떻게해야합니까?
당신이 그것을 모를까요, 이것은 실제로 문제였습니다. 지금은 너무 명백합니다. D. – HaskellElephant