纯功能集



有没有实现纯函数集的算法?

预期的操作将是集、交集差值元素?、空?相邻

这些并不是硬性要求,我很乐意学习一种只实现其中一部分的算法。

您可以使用纯函数式映射实现,只需忽略值即可。

请参阅 http://hackage.haskell.org/packages/archive/containers/0.1.0.1/doc/html/Data-IntMap.html(链接到 https://cstheory.stackexchange.com/questions/1539/whats-new-in-purely-functional-data-structures-since-okasaki (。

(旁注:有关功能数据结构的详细信息,请参阅 http://www.amazon.com/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504 (

几乎任何数据结构都存在纯函数式实现。对于集合或映射,您通常使用某种形式的搜索树,例如红/黑树或AVL树。函数数据结构的标准参考是冈崎的书:

http://www.cambridge.org/gb/knowledge/isbn/item1161740/

其中的重要部分可以通过他的论文免费获得:

http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf

@ninjagecko答案的链接很好。我最近关注的是Clojure中使用的持久数据结构,它们是功能性的,不可变的和持久的。

持久

哈希映射的实现说明可以在这篇由两部分组成的博客文章中找到:

http://blog.higher-order.net/2009/09/08/understanding-clojures-persistenthashmap-deftwice/

http://blog.higher-order.net/2010/08/16/assoc-and-clojures-persistenthashmap-part-ii/

这些是在此参考请求问题中找到的一些想法(请参阅第一个答案,第一个条目(的实现。

从这些结构中产生的集合支持您需要的功能:

http://clojure.org/data_structures#Data 结构集

剩下的就是浏览源代码并尝试绕过它。

这是 OCaml 中纯函数集的实现(它是 OCaml 的标准库(。

有没有实现纯函数集的算法?

您可以使用许多不同的纯函数式数据结构来实现集合操作。有些比其他的具有更好的复杂性。

示例包括:

列表

我们有:

List Difference:
(\) :: Eq a => [a] -> [a] -> [a]

\函数是列表差异((非关联(。在 xs \ ys 的结果中,ys 的每个元素的第一个出现(如果有的话(已经从 xs 中删除。因此

union :: Eq a => [a] -> [a] -> [a]
联合

函数返回两个列表的列表联合。例如

"dog" `union` "cow" == "dogcw"

第一个列表中的重复项和元素将从第二个列表中删除,但如果第一个列表包含重复项,则结果也会如此。这是unionBy的一个特例,它允许程序员提供自己的相等性测试。

intersect :: Eq a => [a] -> [a] -> [a]

相交函数采用两个列表的列表交集。例如

[1,2,3,4] `intersect` [2,4,6,8] == [2,4]

如果第一个列表包含重复项,则结果也会重复项。

不可变集

可以设计更高效的数据结构来提高集合操作的复杂性。例如,Haskell中的标准Data.Set库将集合实现为大小平衡的二叉树:

  • Stephen Adams, "Efficient sets: a balance act", Journal of Functional Programming 3(4(:553-562, October 1993, http://www.swiss.ai.mit.edu/~adams/BB/.

这是这个数据结构:

data Set a    = Bin !Size !a !(Set a) !(Set a)
              | Tip
type Size     = Int

产生以下复杂性:

    并集、
  • 交集、差值:O(n+m(

相关内容

  • 没有找到相关文章

最新更新