搜索

时间:2017-06-19 16:54:40

标签: haskell search functional-programming

我正在编写几个搜索函数,我使用Node数据类型:

data Node a =
  Node { [...]
       , getPath :: [a]    -- ^ Previous states this node has visited
       }

该字段getPath用于检查我之前是否访问过该节点中的状态:扩展新节点时,我通过执行以下操作检查:

visited = `elem` path

它可以工作,但是当扩展了许多节点并且路径变得太长时,它变得非常昂贵。有没有更好的方法来跟踪我访问过的州?也许是一种不同的数据结构(而不​​是列表),这种结构可以更好地用于此用途?

1 个答案:

答案 0 :(得分:3)

答案取决于你的元素有哪些约束(或者可以给出)。

如果您的元素有Ord约束,那么您可以使用容器中的Data.Set来获得O(log n)成员资格测试。

如果您的元素有Hashable约束,那么您可以使用来自无序容器的HashSet来获得具有更好常数因子的O(log n)成员资格测试*以及它们所具有的足够大的基数大多数用例的有效时间。

如果您的元素只有Eq约束,那么您不能比列表做得更好。

*取决于Hashable实例的性能。如有疑问,请以基准为准。