我正在实现一个带有以下签名的函数来解决Haskell中的0-1背包问题。
knapsack :: [Item] -> Capacity -> [Item]
将Item
和Capacity
文件定义为:
type Value = Int
type Weight = Int
type Capacity = Int
type Item = (Value, Weight)
我想记住它以获得更好的表现。我尝试使用Data.MemoCombinators,但我无法了解如何使用它。
你能给我一些提示吗?
答案 0 :(得分:6)
我成功地将MemoTrie用于此类任务。要用作记忆索引的每种类型都必须实现HasTrie
。在您的情况下,您不必重复任何内容,因为包已经为原始数据类型以及对和列表提供了实例。
import Data.MemoTrie
type Value = Int
type Weight = Int
type Capacity = Int
type Item = (Value, Weight)
knapsack :: [Item] -> Capacity -> [Item]
knapsack = memo2 knapsack'
where
knapsack' items capacity = ... -- your computation goes here
答案 1 :(得分:2)
如果您正在寻找列表操作的性能优化,我建议您查看严格的迭代函数,例如Data.List.foldl'
:
foldl'::(a - > b - > a) - > a - > [b] - >一个