【问题标题】:Keep record of previously visited states when searching搜索时记录以前访问过的状态
【发布时间】:2017-06-20 02:03:55
【问题描述】:

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

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

getPath 字段是我用来检查我之前是否访问过该节点中的该状态的字段:扩展新节点时,我会通过以下方式检查:

visited = `elem` path

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

【问题讨论】:

  • 如果ahashable,你可以使用hashset

标签: haskell search functional-programming


【解决方案1】:

答案取决于你的元素有什么限制(或可以给定)。

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

如果您的元素有 Hashable 约束,那么您可以使用来自 unordered-containers 的 HashSet 来获得 O(log n) 成员资格测试,该测试具有更好的常数因子*和足够大的基数,因此它们在大多数情况下都是有效的常数时间案例。

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


* 取决于Hashable 实例的性能。如有疑问,请进行基准测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多