前段时间,我遇到了关于 FingerTrees 的文章 http://scienceblogs.com/goodmath/2010/04/finger_trees_done_right_i_hope.php(也可以看看附带的堆栈溢出问题 https://stackoverflow.com/questions/8450448/finding-the-missing-reduce-typeclass-from-finger-tree-article)并将这个想法归档。我终于找到了使用它们的理由。
我的问题是Data.FingerTree 包 http://hackage.haskell.org/package/fingertree-0.0.1.0边缘似乎有点腐烂。而且,数据序列 http://www.haskell.org/ghc/docs/latest/html/libraries/containers/Data-Sequence.html在使用数据结构的 Containers 包中重新实现 http://www.haskell.org/ghc/docs/latest/html/libraries/containers/src/Data-Sequence.html#line-259一个(可能更好)版本,但不导出它。
尽管这种结构在理论上似乎很有用,但它似乎并没有得到太多的实际使用或关注。人们是否发现 FingerTrees 在实际中没有什么用处,或者这是一个没有引起足够重视的情况?
进一步解释:
我有兴趣构建一个包含具有良好串联属性的文本的数据结构。考虑从各种片段构建 HTML 文档。大多数预构建的解决方案都使用字节串,但我真的想要一些能够正确处理 Unicode 文本的东西。我目前的计划是将 Data.Text 片段分层到 FingerTree 中。
我还想借用 Data.Vector 的技巧,即在不使用(偏移量,长度)操作进行复制的情况下进行切片。 Data.Text.Text 将此内置到数据类型中,但仅将其用于高效的 uncons 和 unsnoc 操作。在 FingerTree 中,这些信息很容易成为v
或树的注释。
特别要回答关于手指树的问题,我认为问题在于与数组相比,它们具有相对较高的恒定成本,并且比实现高效串联的其他方法更复杂。构建器有一个更有效的接口,用于仅附加块,并且它们通常很容易获得(请参阅@informatikr的答案中的链接)。假设Data.Text.Lazy
是用块的链接列表实现的,并且您正在创建一个Data.Text.Lazy
来自建筑商。除非您有很多块(可能超过 50 个),或者重复访问列表末尾附近的数据,否则手指树的高恒定成本可能不值得。
The Data.Sequence
出于性能原因,实现是专门的,并且不像 提供的完整接口那么通用fingertree
包裹。这就是为什么它不被导出;除了Sequence
.
我还怀疑许多程序员不知道如何实际使用幺半群注释,因为它背后有一个相当重要的抽象障碍。很多人不会使用它,因为他们不知道它与其他数据类型相比有何用处。
直到读了 Chung-jieh Shan 的博客系列后我才真正明白字数 http://conway.rutgers.edu/~ccshan/wiki/blog/posts/WordNumbers1/ (part2 http://conway.rutgers.edu/~ccshan/wiki/blog/posts/WordNumbers2/, part3 http://conway.rutgers.edu/~ccshan/wiki/blog/posts/WordNumbers3/, part4 http://conway.rutgers.edu/~ccshan/wiki/blog/posts/WordNumbers4/)。这证明这个想法绝对可以在实际代码中使用。
在您的情况下,如果您需要检查部分结果并进行有效的附加,那么使用 Fingertree 可能比构建器更好。根据构建器的实现,当您转换为Text
,向构建器添加更多内容,转换为Text
再次等等。但这取决于您的使用模式。
您可能对我的感兴趣展开树 http://hackage.haskell.org/package/splaytree包,它提供了带有幺半群注释的展开树,以及在它们之上构建的几种不同的结构。除了伸展树本身之外,Set
and RangeSet
模块具有或多或少完整的 API,Sequence
模块主要是我用于测试的骨架。它不是您正在寻找的“包含电池”的解决方案(同样,@informatikr 的答案提供了这些),但如果您想尝试幺半群注释,它可能比Data.FingerTree
。请注意,如果按顺序遍历所有元素(或不断地插入末尾,或类似的),展开树可能会变得不平衡,但如果追加和查找是交错的,则性能可能会非常好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)