【发布时间】:2018-03-25 08:09:17
【问题描述】:
我想知道如何通过记忆来制作高效的算法。特别是,有没有办法让 Haskell 中索引值的访问时间为 O(1)?
这里是the problem described in detail。这是我对递归算法的尝试:
denom :: (Int, Int) -> [Int] -> Int
denom (_, 0) _ = 0
denom (0, _) _ = (maxBound :: Int) - 1000 -- subtracting 1000 otherwise overflows
denom (i, j) di
| v > j = denom (i-1, j) di
| otherwise = min (denom (i-1, j) di) (1 + denom (i, j-v) di)
where v = di !! (i - 1)
另外,我将如何在 Haskell 中声明 INFINITY 以便 min 在所有情况下都有效?
【问题讨论】:
-
你可以通过使用数组而不是列表来获得 O(1)
!。 -
如果您不想自己编写备忘录,则存在helper libraries。
标签: haskell dynamic-programming memoization