【问题标题】:Generic Trie Haskell implementation通用 Trie Haskell 实现
【发布时间】:2013-04-18 13:48:47
【问题描述】:

我需要在 Haskell 中实现通用的 Trie,但我找不到。

我实现了my own functions(这里只有键,我不需要关于 Trie 的数据)但我想在 Haskell 中找到一个好的 Trie 实现以备将来使用(我是新手 Haskeller)。

我找到了 Data.Trie,但键是 ByteString。

Data.Trie 是正确的选项吗? (然后就不知道怎么用了)

谢谢!!! :D

【问题讨论】:

  • 没有办法编写适用于任意键类型的 trie。你想用什么键?请注意,Data.IntMapData.IntSet 是使用 Int 键尝试的。
  • C.A. McCann,一个 Trie 只需要一个支持 Equality 运算符的类型来处理有序的源数据。有了它,你可以构建一个 Trie。如果你不知道底层类型有什么关系?我的实现不是 Trie 吗?谢谢! (但假设键类型是 [a])
  • 是的,你需要的键要么是某种序列,要么是你可以变成序列的东西。例如,Data.IntMapInt 视为位序列。能够直接对每个块进行排序或索引很好,但是可以比较是否相等的事物列表就足够了。无论如何,有a package list-tries out there,但它总是让我感到有点困惑。
  • @C.A.McCann 定义对近乎任意键类型的尝试本身没有任何问题。例如看这篇论文:citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.1.6342AFAIK,Conal 的MemoTrie 包中使用了这个想法,但用于记忆的特定目的。
  • @kosmikus:当然,但要强调“附近”。您不需要太多,但不会发生完全多态且没有类约束的 trie。

标签: haskell package trie


【解决方案1】:

查看 MemoTrie 包 on Hackageon GitHub。 有关简单而美丽的基础理论的背景,请参阅 Haskell wiki page on memoization,其中包括 Ralf Hinze 的两篇论文,我的一篇和 some blog posts

另一个 trie/memoization 包是 functor-combo,也是 on Hackageon GitHub。 这个包体现了Elegant memoization with higher-order types 和其他博客文章中描述的想法的实现。

其他一些相关的包:

【讨论】:

  • 谢谢Conal,但我无法将您的回答映射到我的问题中(我确定是我的错)。直觉上,我无法理解如何检查(内部)记忆结构,另一方面,使用 trie,我可以检查该结构以产生新信息(记忆作为黑盒运行)。我经常阅读你的帖子,但对我来说太难了(就像魔术一样):D :D 还是谢谢你!!!!
  • @josejuan:“记忆结构”特里。记忆是两个阶段的组合:memo = untrie . trie。第一阶段 (trie) 将函数转换为 trie,第二阶段将该 trie 转换回函数。如果您想要的只是记忆,您可以将memo 视为一个黑匣子。如果您想要更多地检查和转换数据本身,只需在trieuntrie 之前进行调解。这些 trie 结构始终位于 FunctorApplicativeFoldableTraversableMonad 中,因此可以立即对它们进行操作。
【解决方案2】:

应要求从评论中移出...

我想到的唯一一个非常通用的 trie 实现是the list-tries package。它总是让我觉得有点过度设计,但是一个人的“过于复杂”是另一个人的“功能齐全”,所以如果它适合你的目的,那就去吧。此外,该软件包似乎得到了积极的维护,这很好。

哦,由于包没有在任何我能看到的地方明确说明这一点:“Patricia trie”版本是一种将单分支节点序列压缩为存储公共密钥前缀的单个节点的 trie。所以对于键“aabb”和“aabc”,你会得到一个带有“aab”的节点,然后分支“b”和“c”。标准的 trie 总是一次分支一个元素。

【讨论】:

    【解决方案3】:

    http://hackage.haskell.org/package/TrieMap 是我当时的一些工作。我不太清楚 you 的“通用”是什么意思,但TrieMap 或多或少支持任意(递归,甚至!)代数数据类型,例如二叉树,作为 trie 键。

    【讨论】:

    • 非常有趣,谢谢! list-tries 是直接使用的,因为“通用 trie”可以从任何其他结构中使用(例如,一棵树是可遍历/可排序的,那么您可以将它与 list-tries 一起使用,另一个,您可以将 IntTrie 转换为 list -trie [Bit]),但你的实现明确地做到了! (我看到了你的包裹但我没有意识到),我将来会使用,当然! :D 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2010-10-15
    • 2011-08-27
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多